Cómo aumentar el tiempo de espera para un solo caso de prueba en mocha

405

Estoy enviando una solicitud de red en un caso de prueba, pero esto a veces lleva más de 2 segundos (el tiempo de espera predeterminado).

¿Cómo aumento el tiempo de espera para un solo caso de prueba?

Mahendra S
fuente

Respuestas:

669

Aquí tienes: http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

Para la función de flecha, utilice lo siguiente:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);
Dan Kohn
fuente
23
el tiempo de espera es en milisegundos y el valor predeterminado es 2000.
Ethan Mick
47
Estaba usando funciones de flecha es6 y tuve que recurrir a las antiguas definiciones de 'funciones' para que "esto" funcione.
Aruna Herath el
1
También funciona para ganchos, comobefore(function(done){this.timeout(5 * 1000);...});
JP
2
@AH La razón por la cual la función de flecha no funcionó es por esto léxico
Tanner Faulkner
11
¿Hay alguna manera de que funcione con la función de flecha? editar: agregar .timeout(500)al final deit(...).timeout(500)
chovy
136

Si desea utilizar las funciones de flecha es6, puede agregar un .timeout(ms)al final de su itdefinición:

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

Al menos esto funciona en mecanografiado.

Chris Sparrow
fuente
3
Esto funciona, pero .timeoutno está incluido en las tipificaciones DefinitelyTyped para mocha: i.imgur.com/jQbWCn1.png - Usar this.timeout(2000)o this.slow(500)con una función antigua normal funciona y se compila sin errores
Leon Adler
3
Lamentablemente, esto solo funciona it, no funciona describe.
robrich
3
¿Hay alguna manera de hacer esto para describe()o context()?
chovy
1
@LeonAdler .timeoutse incluye ahora en tipificaciones de Mocha DefinitelyTyped en: Mocha.IRunnable. Sin embargo, si está utilizando el IDE de Webstorm para ejecutar estas pruebas, una nota de precaución: por cualquier razón, el complemento de integración Mocha de WebStorm todavía no reconoce las pruebas Mocha con .timeout()adjuntas (lo que significa que no aparece el botón 'ejecutar' junto a ellas), y por eso abogo por evitar las funciones de flecha para permitir el uso de en su this.timeout()lugar.
Jamie Birch
Esto es perfecto. Para la función asíncrona que devuelve una promesa, puede dejarla hecha ().
billoverton
72

(desde que me encontré con esto hoy)

Tenga cuidado al usar la sintaxis de flecha de grasa ES2015:

Esto fallará:

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

EDITAR: Por qué falla:

Como @atoth menciones en los comentarios, las flechas de grasa funciones no tienen su propia esta unión. Por lo tanto, no es posible que la función it se una a esta devolución de llamada y proporcione una función de tiempo de espera .

En pocas palabras : no utilice las funciones de flecha para las funciones que necesitan un mayor tiempo de espera.

chriskelly
fuente
2
Porque las funciones de flecha no tienen esto en absoluto. Lea más aquí: blog.getify.com/arrow-this
atoth
2
Sí, pero he explicado esto en la respuesta. Mira mi comentario // dentro del código. Probablemente debería explicarlo fuera del bloque de código para hacerlo más claro. esto existe pero proviene del alcance externo.
chriskelly
1
Mi explicación es más precisa. No hay thisenlace en las funciones de flecha, no de la misma manera sugeriría que tienen algún tipo de, simplemente diferente. Solo tienen ámbitos léxicos. No puede vincular esto no existente. Por eso .bind, .calletc. no funciona con él.
atoth
1
Eso es cierto, y tu derecho es más preciso. Gracias
chriskelly
1
Diría que es por eso que solo debes usar flechas gruesas cuando las necesites, pero he perdido la noción de lo que thises.
xdumaine
42

Si está utilizando NodeJS, puede configurar el tiempo de espera en package.json

"test": "mocha --timeout 10000"

entonces puedes ejecutar usando npm como:

npm test

fuente
1
Eso es para todos los casos de prueba, no para un solo caso de prueba
garryp
Estuve de acuerdo en que esto no responde la pregunta, pero fue suficiente para mi caso de uso donde no me importaba si aumentaba para todas las pruebas. Creo que a muchas personas que terminan aquí puede no importarles si es para una prueba o para todas, así que agradezco que esta respuesta esté aquí.
billoverton
22

Desde la línea de comando:

mocha -t 100000 test.js
andrey
fuente
14
Esto aumenta el tiempo de espera para todos los casos de prueba en lugar de "para un caso de prueba en particular" como hace la pregunta.
Louis
16

También puede pensar en adoptar un enfoque diferente y reemplazar la llamada al recurso de red con un trozo o un objeto simulado. Con Sinon , puede desacoplar la aplicación del servicio de red, enfocando sus esfuerzos de desarrollo.

David Souther
fuente
77
No es del todo irrelevante; con frecuencia, tiene sentido bloquear la respuesta de la red para que no dependa de que la máquina esté activa o devuelva la respuesta correcta. Sin embargo, si está probando la respuesta en sí, entonces sí, aún debe hacerlo.
aendrew
2
Estoy usando sinon / mocha para construir algunas pruebas de integración, por lo que los tiempos de espera más altos son relevantes.
jcollum
9

Para navegación de prueba en Express:

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

En el ejemplo, el tiempo de prueba es 4000 (4s).

Nota: setTimeout(done, 3500)es menor de lo que donese llama dentro del tiempo de la prueba, pero clearTimeout(timeOut)evita que se use todo este tiempo.

alditis
fuente
2

¡Esto funcionó para mí! No se pudo encontrar nada para que funcione antes ()

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});
Otpidus
fuente
.timeout () funcionó perfectamente!
acidjazz