javascript - Mensaje "La devolución de llamada asíncrona no se invocó dentro del tiempo de espera de 5000 ms especificado por jest.setTimeout"
Estoy usando Puppeteer y Jest para ejecutar algunas pruebas de front-end.
Mis pruebas se ven de la siguiente manera:
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);
});
A veces, cuando ejecuto las pruebas, todo funciona como se esperaba. Otras veces, obtengo un error:
Tiempo de espera: la llamada asincrónica no se invocó dentro del tiempo de espera de 5000 ms especificado por jest.setTimeout.
at node_modules/jest-jasmine2/build/queue_runner.js:68:21 <br/> at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)
Esto es extraño porque:
Especifiqué que el tiempo de espera fuera de 30000
Si obtengo o no este error parece ser muy aleatorio
¿Por qué está pasando esto?
Respuesta #1
El tiempo de espera que especifique aquí debe ser más corto que el tiempo de espera predeterminado.
El tiempo de espera predeterminado es 5000 y el marco por defecto es jasmine en caso de jest. Puedes especificar el tiempo de espera dentro de la prueba agregando
jest.setTimeout(30000);
Pero esto sería específico para la prueba. O puedes configurar el archivo de configuración para el marco.
Configurando Jest
// jest.config.js
module.exports = {
// setupTestFrameworkScriptFile has been deprecated in
// favor of setupFilesAfterEnv in jest 24
setupFilesAfterEnv: ['./jest.setup.js']
}
// jest.setup.js
jest.setTimeout(30000)
Ver también estos hilos:
setTimeout para prueba #5055
Hacer que jasmine.DEFAULT_TIMEOUT_INTERVAL sea configurable #652
P.D.: La falta de ortografía setupFilesAfterEnv (es decir, setupFileAfterEnv) también generará el mismo error.
Respuesta #2
Debería llamar al async/await cuando sea asincrónico desde la prueba.
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);
});
Respuesta #3
La respuesta a esta pregunta ha cambiado a medida que Jest ha evolucionado. Respuesta actual (marzo de 2019):
Puedes anular el tiempo de espera de cualquier prueba individual añadiendo un tercer parámetro a
it. Es decir,it('runs slow',() => {...}, 9999)Puedes cambiar el valor predeterminado usando
jest.setTimeout. Para hacer esto:// Configuration "setupFilesAfterEnv": [ // NOT setupFiles "./src/jest/defaultTimeout.js" ],y
// File: src/jest/defaultTimeout.js /* Global jest */ jest.setTimeout(1000)Como otros han señalado, y no está directamente relacionado con esto,
doneno es necesario con el enfoque async/await.
Respuesta #4
Esta es una actualización relativamente nueva, pero es mucho más sencilla. Si estás usando Jest 24.9.0 o superior, puedes simplemente agregar testTimeout a tu configuración:
// in jest.config.js
module.exports = {
testTimeout: 30000
}
Respuesta #5
Para Jest 24.9+, solo necesitamos agregar --testTimeout en la línea de comandos:
--testTimeout= 10000 // Timeout of 10 seconds
El valor de tiempo de espera predeterminado es 5000 (5000 ms - 5 segundos). Esto será aplicable para todos los casos de prueba.
O si solo quieres dar un tiempo de espera a una función en particular, entonces puedes usar esta sintaxis al declarar el caso de prueba.
test(name, fn, timeout)
Ejemplo
test('example', async () => {
}, 10000); // Timeout of 10 seconds (default is 5000 ms)
Respuesta #6
Me gustaría añadir (esto es un poco largo para un comentario) que incluso con un tiempo de espera de 3000 mis pruebas todavía a veces (aleatoriamente) fallarían con
Tiempo de espera: la llamada asincrónica no se invocó dentro del tiempo de espera de 5000 ms especificado por jest.setTimeout.
Gracias a la gran respuesta de Tarun, creo que la forma más corta de arreglar muchas pruebas es:
describe('Puppeteer tests', () => {
beforeEach(() => {
jest.setTimeout(10000);
});
test('Best Jest test fest', async () => {
// Blah
});
});
Respuesta #7
Para Jest 24.9+, también puedes configurar el tiempo de espera desde la línea de comandos agregando --testTimeout.
Aquí hay un extracto de su documentación:
--testTimeout=<número>
Tiempo de espera predeterminado de una prueba en milisegundos. Valor predeterminado: 5000.
Respuesta #8
Asegúrate de invocar done(); en los callbacks o simplemente no pasará la prueba.
beforeAll((done /* Call it or remove it */ ) => {
done(); // Calling it
});
Se aplica a todas las demás funciones que tienen un callback done().
Respuesta #9
Otra solución más: establece el tiempo de espera en el archivo de configuración de Jest, por ejemplo:
{ // ... other stuff here
"testTimeout": 90000
}
