J'utilise marionnettiste et plaisanterie pour exécuter des tests frontaux.
Mes tests se présentent comme suit:
describe("Profile Tab Exists and Clickable: /settings/user", () => {
test(`Assert that you can click the profile tab`, async () => {
await page.waitForSelector(PROFILE.TAB);
await page.click(PROFILE.TAB);
}, 30000);
});
Parfois, lorsque je lance les tests, tout fonctionne comme prévu. D'autres fois, j'obtiens une erreur:
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
at node_modules/jest-jasmine2/build/queue_runner.js:68:21
at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)
C'est étrange car:
J'ai spécifié que le délai d'expiration était de 30000
Que j'obtienne ou non cette erreur est apparemment très aléatoire
Quelqu'un peut-il deviner pourquoi cela se produit?
Réponses:
Par conséquent, le délai d'expiration que vous spécifiez ici doit être plus court que le délai d'expiration par défaut.
Le délai d'expiration par défaut est
5000
et le cadre par défaut estjasmine
en cas dejest
. Vous pouvez spécifier le délai d'expiration à l'intérieur du test en ajoutantMais cela serait spécifique au test. Ou vous pouvez configurer le fichier de configuration pour le framework.
https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string
Voir aussi ce fil
https://github.com/facebook/jest/issues/5055
https://github.com/facebook/jest/issues/652
PS faute d'orthographe
setupFilesAfterEnv
(c'est-à-diresetupFileAfterEnv
) lancera également la même erreur.la source
setupTestFrameworkScriptFile
a été remplacé parsetupFilesAfterEnv
, il devient doncsetupFilesAfterEnv: ["./jest.setup.js"]
jest.setTimeout(10000)
pouvait être ajouté à un seul test pour un cas de bord afin que la configuration entière n'ait pas besoin de changer :)jest.setTimeout(30000);
dansjest.config.js
je reçois « ReferenceError: plaisanterie n'est pas défini ». J'ai essayé d'ajouterconst jest = require("jest");
mais je reçois "TypeError: jest.setTimeout n'est pas une fonction".setupFilesAfterEnv
argument dansjest.config.js
pointera vers un autre fichier où nous avons mis l'jest.setTimeout(30000)
option. C'est bien que nous puissions configurer cela mais cela me semble un peu compliqué cependant.Il doit appeler le
async/await
quand il est asynchrone du test.la source
done
une fonction asynchrone? Ne retournons-nous pas simplement Promise ou indéfini?page.click
. done () est utilisé, au moins dans mon cas, principalement pour les tests avec des rappels.done
rappel qui n'est pas nécessaire.done
dans ce cas) dans le rappel fait attendre Jest jusqu'à ce que ce paramètre soit appelé. Sa présence est importante même si elle n'est pas utilisée.La réponse à cette question a changé avec l'évolution de Jest. Réponse actuelle (mars 2019):
Vous pouvez remplacer le délai d'expiration d'un test individuel en ajoutant un troisième paramètre au
it
. c'est à dire.it('runs slow', () => {...}, 9999)
Vous pouvez modifier la valeur par défaut à l'aide de
jest.setTimeout
. Pour faire ça:et
done
n'est pas nécessaire avec l'approche asynchrone / attente.la source
Je voudrais ajouter (c'est un peu long pour un commentaire) que même avec un timeout de
3000
mes tests échouerait parfois (au hasard) avecGrâce à l'excellente réponse de @ Tarun, je pense que le moyen le plus court de corriger beaucoup de tests est:
la source
jest.setTimeout()
intérieurbeforeEach
, l'appeler une fois suffit pour tous les tests.Il s'agit d'une mise à jour relativement nouvelle, mais elle est beaucoup plus simple. Si vous utilisez jest 24.9.0 ou supérieur, vous pouvez simplement ajouter
testTimeout
à votre configuration:la source
Assurez-vous d'invoquer des
done();
rappels ou il ne passera pas simplement le test.S'applique à toutes les autres fonctions qui ont un rappel done ().
la source
Pour jest 24.9+, vous pouvez également définir un délai d'expiration à partir de la ligne de commande en ajoutant
--testTimeout
Voici un extrait de ses documents
la source
J'ai récemment rencontré ce problème pour une autre raison: j'exécutais des tests de manière synchrone
jest -i
, et cela allait juste expirer. Quel que soit le raisonnement, exécuter les mêmes tests en utilisantjest --runInBand
(même si-i
est censé être un alias) n'expire pas.Peut-être que cela aidera quelqu'un
¯\_(:/)_/¯
la source
Le problème de délai d'attente se produit lorsque le réseau est lent ou que de nombreux appels réseau sont effectués à l'aide de
await
, ces scénarios dépassent le délai par défaut, c'est-à-dire 5000 ms. Pour éviter l'erreur d'expiration, augmentez simplement le délai d'expiration des globaux qui prennent en charge un délai d'expiration. Une liste des mondiaux et leur signature peut être trouvée ici .Pour Jest 24.9
la source
Si sur Jest <= 23:
Si Jest> 23:
la source
Pour ceux qui recherchent une explication à
jest --runInBand
votre sujet, consultez la documentation Exécution de marionnettiste dans les environnements CI https://github.com/smooth-code/jest-puppeteerla source
Dans le cas où quelqu'un ne résout pas le problème, utilisez les méthodes ci-dessus, j'ai corrigé le mien en entourant la fonction asynchrone par une fonction de flèche. Un péché:
la source
Dans mon cas, cette erreur a commencé à apparaître de manière aléatoire et ne disparaîtrait pas même après avoir défini un délai d'expiration de 30000. La simple fin du processus dans le terminal et la réexécution des tests ont résolu le problème pour moi. J'ai également supprimé le délai d'attente et les tests réussissent encore.
la source
Dans Node ... ce que je vois que les gens ont fait comme exemple est ci-dessous, en utilisant
fakeEventEmitter
la source