JEST: le rappel Async n'a pas été invoqué dans le délai de 5000ms spécifié par jest.setTimeout

j'utilise puppeteer and jest pour faire des tests avant.

mes tests sont les suivants:

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, quand je fais 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 précisé que le délai d'attente à 30000

  2. si j'obtiens ou non cette erreur est apparemment très aléatoire

quelqu'un Peut-il devinez pourquoi ce qui se passe?

24
demandé sur Canta 2018-04-02 03:34:43

4 réponses

donc le délai que vous spécifiez ici doit être plus court que le délai par défaut.

le délai par défaut est 5000 et le cadre par défaut est jasmine en cas de jest. Vous pouvez spécifier le délai à 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 cadre.

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 plus, ce fil

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

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

32
répondu Tarun Lalwani 2018-04-16 18:58:36

il devrait appeler la fonction done quand il est async de test.

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async (done) => {
        await page.waitForSelector(PROFILE.TAB);
        await page.click(PROFILE.TAB);
        done();
    }, 30000);
});
8
répondu schrodinger's code 2018-08-03 19:23:15

je voudrais ajouter (c'est un peu long pour un commentaire) que même avec un délai d'attente de 3000 mes tests échoueraient encore parfois (au hasard) avec

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

grâce à la réponse géniale de @Tarun, je pense que le moyen le plus court de corriger beaucoup de tests est:

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

  test('best jest test fest', async () => {
    // blah
  });
});
0
répondu Roman 2018-09-27 19:02:50

ma solution ici: Mais je ne sais pas s'il correspond à votre code ou non, mais vous pouvez essayer cela.

it('GET should return a status of 200 OK', async (done) => {
  await frisby
    .get('api-url')
    .expect('status', 200)
    .done(done)
});
-5
répondu Sakuna Chheourng 2018-08-05 00:07:33