Estoy usando titiritero y broma 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, recibo un error:
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)
Esto es extraño porque:
Especifiqué que el tiempo de espera sea 30000
Si recibo o no este error es aparentemente muy aleatorio
¿Alguien puede adivinar por qué está sucediendo esto?
Respuestas:
Por lo tanto, 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 esjasmine
en caso dejest
. Puede especificar el tiempo de espera dentro de la prueba agregandoPero esto sería específico para la prueba. O puede configurar el archivo de configuración para el marco.
https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string
Ver este hilo también
https://github.com/facebook/jest/issues/5055
https://github.com/facebook/jest/issues/652
La falta de ortografía de PS
setupFilesAfterEnv
(es decirsetupFileAfterEnv
) también arrojará el mismo error.fuente
setupTestFrameworkScriptFile
ha sustituido porsetupFilesAfterEnv
, por lo que se conviertesetupFilesAfterEnv: ["./jest.setup.js"]
jest.setTimeout(10000)
podría agregarse a una sola prueba para un caso perimetral, por lo que no fue necesario cambiar toda la configuración :)jest.setTimeout(30000);
en eljest.config.js
recibo "ReferenceError: broma no está definido". Intenté agregarconst jest = require("jest");
pero luego aparece "TypeError: jest.setTimeout no es una función".setupFilesAfterEnv
argumento enjest.config.js
apuntará a otro archivo donde ponemos lajest.setTimeout(30000)
opción. Es bueno que podamos configurar esto, pero me parece un poco complicado.Debería llamar al
async/await
cuando es asíncrono de la prueba.fuente
done
una función asíncrona? ¿No simplemente devolvemos Promise o undefined?page.click
. done () se usa, al menos en mi caso, principalmente para probar con devoluciones de llamada.done
devolución de llamada que no es necesaria.done
en este caso) en la devolución de llamada hace que Jest espere hasta que se llame a este parámetro. Su presencia es significativa incluso si no se usa.La respuesta a esta pregunta ha cambiado a medida que Jest ha evolucionado. Respuesta actual (marzo de 2019):
Puede anular el tiempo de espera de cualquier prueba individual agregando un tercer parámetro al
it
. es decir.it('runs slow', () => {...}, 9999)
Puede cambiar el valor predeterminado usando
jest.setTimeout
. Para hacer esto:y
done
no es necesario con el enfoque asíncrono / espera.fuente
Me gustaría agregar (esto es un poco largo para un comentario) que incluso con un tiempo de espera de
3000
mis pruebas todavía a veces (al azar) fallaba conGracias a la gran respuesta de @ Tarun, creo que la forma más corta de arreglar muchas pruebas es:
fuente
jest.setTimeout()
interiorbeforeEach
, llamarlo una vez es suficiente para todas las pruebas.Esta es una actualización relativamente nueva, pero es mucho más sencilla. Si está utilizando jest 24.9.0 o superior, simplemente puede agregar
testTimeout
a su configuración:fuente
Asegúrese de invocar
done();
en devoluciones de llamada o no pasará simplemente la prueba.Se aplica a todas las demás funciones que tienen una devolución de llamada done ().
fuente
Para jest 24.9+, también puede establecer el tiempo de espera desde la línea de comando agregando
--testTimeout
Aquí hay un extracto de sus documentos
fuente
Recientemente me encontré con este problema por una razón diferente: estaba ejecutando algunas pruebas sincrónicamente
jest -i
, y solo se agotaba el tiempo de espera. Para cualquier razonamiento, ejecutar las mismas pruebas usandojest --runInBand
(aunque-i
esté destinado a ser un alias) no se agota el tiempo de espera.Quizás esto ayude a alguien
¯\_(:/)_/¯
fuente
El problema de tiempo de espera se produce cuando la red es lenta o se realizan muchas llamadas de red
await
, estos escenarios exceden el tiempo de espera predeterminado, es decir, 5000 ms. Para evitar el error de tiempo de espera, simplemente aumente el tiempo de espera de los globales que admiten un tiempo de espera. Puede encontrar una lista de globales y su firma aquí .Para Jest 24.9
fuente
Si en Jest <= 23:
Si en Jest> 23:
fuente
Para aquellos que buscan una explicación sobre
jest --runInBand
usted, pueden ir a la documentación Ejecutar titiriteros en entornos CI https://github.com/smooth-code/jest-puppeteerfuente
En caso de que alguien no solucione el problema, utilice los métodos anteriores, arreglé el mío rodeando la función asíncrona con una función de flecha. Como en:
fuente
En mi caso, este error comenzó a aparecer aleatoriamente y no desaparecería incluso después de establecer un tiempo de espera de 30000. Simplemente finalizar el proceso en el terminal y volver a ejecutar las pruebas resolvió el problema por mí. También eliminé el tiempo de espera y las pruebas aún pasan de nuevo.
fuente
En Nodo ... lo que veo que la gente hizo como ejemplo está a continuación, usando
fakeEventEmitter
fuente