web-dev-qa-db-fra.com

Le rappel asynchrone n'a pas été appelé dans le délai d'expiration de 5000 ms spécifié par jest.setTimeout

J'utilise marionnettiste et plaisante pour faire des tests front-end.

Mes tests ressemblent à ceci:

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 parce que:

  1. J'ai spécifié le délai d'attente à 30000

  2. Que je reçoive ou non cette erreur est apparemment très aléatoire

Quelqu'un peut-il deviner pourquoi cela se produit?

123
Asool

Par conséquent, le délai d'attente que vous spécifiez ici doit être plus court que le délai d'attente par défaut.

Le délai d'attente par défaut est 5000 et le cadre par défaut est jasmine dans le cas de jest. Vous pouvez spécifier le délai d'expiration à l'intérieur du test en ajoutant

jest.setTimeout(30000);

Mais 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

// jest.config.js
module.exports = {
  setupTestFrameworkScriptFile: './jest.setup.js'
}

// jest.setup.js
jest.setTimeout(30000)

Voir ce fil aussi

https://github.com/facebook/jest/issues/5055

https://github.com/facebook/jest/issues/652

139
Tarun Lalwani

Il devrait appeler la fonction done quand il est asynchrone du test.

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);
});
39
schrodinger's code

La réponse à cette question a changé au fur et à mesure que Jest a évolué. Réponse actuelle (mars 2019):

  1. Vous pouvez remplacer le délai d'expiration d'un test individuel en ajoutant un troisième paramètre à la variable it. c'est à dire. it('runs slow', () => {...}, 9999)

  2. Vous pouvez changer la valeur par défaut en utilisant jest.setTimeout. Pour faire ça:

 // config
   "setupFilesAfterEnv": [  // NOT setupFiles
     "./src/jest/defaultTimeout.js"
   ],

et

// File: src/jest/defaultTimeout.js
/* global jest */
jest.setTimeout(1000)
  1. Comme d'autres l'ont fait remarquer, et sans lien direct avec cela, done n'est pas nécessaire avec l'approche asynchrone/wait.
27
ndp

Je voudrais ajouter (c'est un peu long pour un commentaire) que même avec un délai d'attente de 3000 mes tests échouaient encore parfois (de manière aléatoire) avec

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

Grâce à l'excellente réponse de @ Tarun, je pense que le moyen le plus rapide de résoudre de nombreux tests est le suivant:

describe('puppeteer tests', () => {
  beforeEach(() => {
    jest.setTimeout(10000);
  });

  test('best jest test fest', async () => {
    // blah
  });
});
15
Roman

Assurez-vous d'invoquer done(); lors des rappels, sinon le test ne réussira pas.

beforeAll((done /* call it or remove it*/) => {
  done(); // calling it
});

S'applique à toutes les autres fonctions ayant un rappel done ().

10
ZenVentzi

J'ai récemment rencontré ce problème pour une raison différente: j'effectuais des tests de manière synchrone avec jest -i, et le délai expirait. Quel que soit le raisonnement, exécuter les mêmes tests avec jest --runInBand (même si -i est censé être un alias) ne se termine pas.

Peut-être que cela aidera quelqu'un ¯\_(:/)_/¯

1
Jona

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 d'attente par défaut, c'est-à-dire 5 000 ms. Pour éviter l'erreur de délai d'expiration, augmentez simplement le délai d'expiration des paramètres globaux prenant en charge un délai d'expiration. Une liste des globaux et de leur signature peut être trouvée ici .
Pour Jest 24.9

0
neer17

Pour ceux qui recherchent une explication à propos de jest --runInBand, vous pouvez consulter la documentation Exécution de marionnettiste dans les environnements CI https: // github.com/smooth-code/jest-puppeteer

0
Eduardo Hernández