Cambiar el tiempo de espera predeterminado para mocha

161

Si tenemos un archivo de prueba de unidad my-spec.js y se ejecuta con mocha:

mocha my-spec.js

El tiempo de espera predeterminado será de 2000 ms. Se puede sobrescribir para una prueba parcial con un parámetro de línea de comando:

mocha my-spec.js --timeout 5000

¿Es posible cambiar el tiempo de espera predeterminado globalmente para todas las pruebas? es decir, el valor de tiempo de espera predeterminado será diferente de 2000 ms cuando llame a:

mocha my-spec.js
lm.
fuente
El sitio web oficial de Mocha también explica más sobre esto.
RaviRokkam

Respuestas:

305

Por defecto, Mocha leerá un archivo llamado test/mocha.optsque puede contener argumentos de línea de comando. Entonces podría crear un archivo que contenga:

--timeout 5000

Cada vez que ejecute Mocha en la línea de comando, leerá este archivo y establecerá un tiempo de espera de 5 segundos de forma predeterminada.

Otra forma que puede ser mejor dependiendo de su situación es configurarlo así en una describellamada de nivel superior en su archivo de prueba:

describe("something", function () {
    this.timeout(5000); 

    // tests...
});

Esto le permitiría establecer un tiempo de espera solo por archivo.

Puede usar ambos métodos si desea un valor predeterminado global de 5000 pero establecer algo diferente para algunos archivos.


Tenga en cuenta que, por lo general, no puede usar una función de flecha si va a llamar this.timeout(o acceder a cualquier otro miembro de thisese Mocha configurado por usted). Por ejemplo, esto generalmente no funcionará :

describe("something", () => {
    this.timeout(5000); //will not work

    // tests...
});

Esto se debe a que una función de flecha toma thisdel ámbito en el que aparece la función. Mocha llamará a la función con un buen valor thispero ese valor no se pasa dentro de la función de flecha. La documentación para Mocha dice sobre este tema :

Se desaconseja pasar funciones de flecha ("lambdas") a Mocha. Debido al enlace léxico de esto, tales funciones no pueden acceder al contexto Mocha.

Louis
fuente
1
Gracias por la información. Pero intenté modificar el archivo mocha.opts, pero no afecta.
lm.
2
¿Lo creaste en el lugar correcto? Mocha es muy específico sobre dónde quiere este archivo. Si ejecuta Mocha, /home/me/src/proj/entonces Mocha buscará este archivo:/home/me/src/proj/test/mocha.opts
Louis
Muchas gracias . Ahora el cambio afectó
lm.
this.timeout (10000); // tiempo de espera predeterminado ^ TypeError: this.timeout no es una función en Suite. <anónimo> (/Users/jeff.l/Documents/workspace/unit-tests/mocha-chai_tests/checkoutTest.js:12:10)
Jeff Lowery
66
@JeffLowery ¿Estás utilizando una función de flecha? Las funciones de flecha no establecen una nueva this, que generalmente da this.timeoutcomo resultado un error como se muestra en su comentario.
Louis
62

Simplemente agregando a la respuesta correcta, puede establecer el tiempo de espera con la función de flecha de esta manera:

it('Some test', () => {

}).timeout(5000)
Denis
fuente
77
La pregunta es "cambiar el tiempo de espera predeterminado globalmente para todas las pruebas". Su respuesta solo cambia una prueba. describe('suite', () => {...}).timeout(5000)no funciona
aleung
Como en la respuesta anterior, la solución propuesta es actualmente ineficaz. mochajs.org/#timeouts le dice que inserte setTimeoutinstrucciones explícitas dentro de las pruebas.
Marco Faustinelli
esto funcionó para mí con mocha @ 5 (para una prueba específica)
Fernando Gabrieli
@MarcoFaustinelli Estás malentendido los documentos. Los setTimeouts no tienen nada que ver con Mocha. Están allí para demostrar los efectos de la configuración del tiempo de espera.
oligofren
33

Agregando esto para completar. Si (como yo) usa un script en su package.jsonarchivo, simplemente agregue la --timeoutopción a mocha:

"scripts": {
  "test": "mocha 'test/**/*.js' --timeout 10000",
  "test-debug": "mocha --debug 'test/**/*.js' --timeout 10000"
},

Luego puede ejecutar npm run testpara ejecutar su conjunto de pruebas con el tiempo de espera establecido en 10,000 milisegundos.

Freedom_Ben
fuente
En caso de que alguien esté interesado, la mayoría de los IDE también le permiten inyectar opciones de mocha para la ejecución de la prueba; por ejemplo, para WebStorm, puede ingresar esto (es decir, "- timeout 10000") en Ejecutar-> Editar configuraciones-> Opciones adicionales de Mocha.
Rubicon
25

En las versiones actuales de Mocha, el tiempo de espera se puede cambiar globalmente de esta manera:

mocha.timeout(5000);

Simplemente agregue la línea de arriba en cualquier parte de su conjunto de pruebas, preferiblemente en la parte superior de su especificación o en un asistente de prueba separado.


En versiones anteriores, y solo en un navegador, puede cambiar la configuración global mediante mocha.setup.

mocha.setup({ timeout: 5000 });

La documentación no cubre la configuración del tiempo de espera global, pero ofrece algunos ejemplos sobre cómo cambiar el tiempo de espera en otros escenarios comunes.

GOTO 0
fuente
55
Esto no funciona en Node. Consulte stackoverflow.com/a/47915119/893113 . Parece que la opción CLI es la única forma.
paulmelnikow
Yo tampoco trabajo en el navegador. A partir de hoy, la documentación vinculada en la respuesta no menciona ningún timeoutparámetro. Por el contrario, mochajs.org/#timeouts le dice que inserte setTimeoutinstrucciones explícitas dentro de las pruebas.
Marco Faustinelli
@MarcoFaustinelli Estás malentendido los documentos. Los setTimeouts no tienen nada que ver con Mocha. Están allí para demostrar los efectos de la configuración del tiempo de espera.
oligofren