Асинхронный обратный вызов не был вызван в течение времени ожидания 5000 мс, указанного в jest.setTimeout

Я использую puppeteer и jest для запуска некоторых тестов переднего конца.

Мои тесты выглядят следующим образом:

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);
});

Иногда, когда я запускаю тесты, все работает так, как ожидалось. Иногда я получаю сообщение об ошибке:

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)

Это странно, потому что:

  1. Я указал, что тайм-аут будет 30000

  2. Получается ли эта ошибка, кажется, очень случайной

Может ли кто-нибудь догадаться, почему это происходит?

Ответ 1

Таким образом, указанный вами тайм-аут должен быть короче таймаута по умолчанию.

Тайм-аут по умолчанию - 5000 а фреймворк по умолчанию - jasmine в случае jest. Вы можете указать тайм-аут внутри теста, добавив

jest.setTimeout(30000);

Но это было бы специфично для теста. Или вы можете настроить файл конфигурации для фреймворка.

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)

Смотрите также эту тему

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

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

Ответ 2

Он должен вызывать async/await, когда он асинхронен из теста.

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);
});

Ответ 3

Ответ на этот вопрос изменился с развитием Jest. Текущий ответ (март 2019):

  1. Вы можете изменить тайм - аут любого отдельного теста, добавляя третий параметр к it. то есть. it('runs slow',() => {...}, 9999)

  2. Вы можете изменить значение по умолчанию, используя jest.setTimeout. Сделать это:

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

а также

// File: src/jest/defaultTimeout.js
/* global jest */
jest.setTimeout(1000)
  1. Как уже отмечали другие, и не имеет прямого отношения к этому, в использовании async/await не нужно done.

Ответ 4

Я хотел бы добавить (это немного длинный комментарий), что даже с таймаутом 3000 мои тесты все же иногда (случайным образом) терпят неудачу с

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

Благодаря @Tarun отличный ответ, я думаю, что самый короткий способ исправить множество тестов:

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

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

Ответ 5

Обязательно вызовите done(); на обратные вызовы или он не будет просто пройти тест.

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

Применяется ко всем другим функциям, которые имеют обратный вызов done().

Ответ 6

Недавно я столкнулся с этой проблемой по другой причине: я выполнял некоторые тесты синхронно, используя jest -i, и это было просто тайм-аут. По каким-то jest --runInBand выполнение тех же тестов с использованием jest --runInBand (даже при том, что -i должен быть псевдонимом) не истекает.

Может быть, это кому-нибудь поможет ¯\_(:/)_/¯

Ответ 7

Проблема тайм-аута возникает, когда сеть работает медленно или многие сетевые вызовы выполняются с использованием await, эти сценарии превышают тайм-аут по умолчанию, т.е. 5000 мс. Чтобы избежать ошибки тайм-аута, просто увеличьте тайм-аут глобалов, которые поддерживают тайм-аут. Список глобалов и их подпись можно найти здесь.
Для шутки 24,9

Ответ 8

Для тех, кто ищет объяснение jest --runInBand вы можете обратиться к документации " Работа кукловода в среде CI" https://github.com/smooth-code/jest-puppeteer.

Ответ 9

Для jest 24. 9+ Вы также можете установить тайм-аут из командной строки, добавив --testTimeout

Вот выдержка из его документов

--testTimeout=<number>
Default timeout of a test in milliseconds. Default value: 5000.

Ответ 10

Я обнаружил, что ответ Roman работает лучше всего в тех случаях, когда я занимаюсь, хотя увеличение тайм-аута по умолчанию также будет хорошей идеей.

Ответ 11

Мое решение здесь: Но я не знаю, что это соответствует вашему кодовому условию или нет, но вы можете попробовать это.

it('GET should return a status of 200 OK', async (done) => {
  await frisby
    .get('api-url')
    .expect('status', 200)
    .done(done)
});