Асинхронный обратный вызов не был вызван в течение времени ожидания 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)
Это странно, потому что:
-
Я указал, что тайм-аут будет 30000
-
Получается ли эта ошибка, кажется, очень случайной
Может ли кто-нибудь догадаться, почему это происходит?
Ответы
Ответ 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):
-
Вы можете изменить тайм - аут любого отдельного теста, добавляя третий параметр к it
. то есть. it('runs slow',() => {...}, 9999)
-
Вы можете изменить значение по умолчанию, используя jest.setTimeout
. Сделать это:
// config
"setupFilesAfterEnv": [ // NOT setupFiles
"./src/jest/defaultTimeout.js"
],
а также
// File: src/jest/defaultTimeout.js
/* global jest */
jest.setTimeout(1000)
- Как уже отмечали другие, и не имеет прямого отношения к этому, в использовании 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)
});