En la prueba de mocha durante la llamada a la función asíncrona, cómo evitar el tiempo de espera Error: se excedió el tiempo de espera de 2000 ms

En mi aplicación de nodo estoy usando mocha para probar mi código. Mientras llamo a muchas funciones asincrónicas usando mocha, Error: timeout of 2000ms exceeded. ( Error: timeout of 2000ms exceeded. ). ¿Cómo puedo resolver esto?

 var module = require('../lib/myModule'); var should = require('chai').should(); describe('Testing Module', function() { it('Save Data', function(done) { this.timeout(15000); var data = { a: 'aa', b: 'bb' }; module.save(data, function(err, res) { should.not.exist(err); done(); }); }); it('Get Data By Id', function(done) { var id = "28ca9"; module.get(id, function(err, res) { console.log(res); should.not.exist(err); done(); }); }); }); 

Puede establecer el tiempo de espera cuando ejecuta su prueba:

 mocha --timeout 15000 

O puede establecer el tiempo de espera para cada paquete o cada prueba de forma programática:

 describe('...', function(){ this.timeout(15000); it('...', function(done){ this.timeout(15000); setTimeout(done, 15000); }); }); 

Para obtener más información, vea los documentos .

Encuentro que la “solución” de simplemente boost los tiempos muertos oscurece lo que realmente está sucediendo aquí, que es

  1. Su código y / o llamadas de red son demasiado lentos (deben ser inferiores a 100 ms para una buena experiencia de usuario)
  2. Las aserciones (pruebas) están fallando y algo está tragándose los errores antes de que Mocha pueda actuar sobre ellos.

Generalmente encuentras # 2 cuando Mocha no recibe errores de aserción de una callback. Esto es causado por otro código que se traga la excepción más arriba en la stack. La forma correcta de lidiar con esto es corregir el código y no tragar el error .

Cuando el código externo se traga tus errores

En caso de que sea una función de biblioteca que no pueda modificar, debe detectar el error de aserción y pasarlo a Mocha usted mismo. Para ello, ajuste su callback de aserción en un bloque try / catch y pase cualquier excepción al manejador hecho.

 it('should not fail', function (done) { // Pass reference here! i_swallow_errors(function (err, result) { try { // boilerplate to be able to get the assert failures assert.ok(true); assert.equal(result, 'bar'); done(); } catch (error) { done(error); } }); }); 

Esta repetición se puede, por supuesto, extraer en alguna función de utilidad para hacer que la prueba sea un poco más agradable a la vista:

 it('should not fail', function (done) { // Pass reference here! i_swallow_errors(handleError(done, function (err, result) { assert.equal(result, 'bar'); })); }); // reusable boilerplate to be able to get the assert failures function handleError(done, fn) { try { fn(); done(); } catch (error) { done(error); } } 

Acelerando las pruebas de red

Aparte de eso, le sugiero que obtenga los consejos para comenzar a usar los comprobantes de prueba para llamadas de red para que las pruebas pasen sin tener que depender de una red en funcionamiento. Usando Mocha, Chai y Sinon, las pruebas pueden parecerse a esto

 describe('api tests normally involving network calls', function() { beforeEach: function () { this.xhr = sinon.useFakeXMLHttpRequest(); var requests = this.requests = []; this.xhr.onCreate = function (xhr) { requests.push(xhr); }; }, afterEach: function () { this.xhr.restre(); } it("should fetch comments from server", function () { var callback = sinon.spy(); myLib.getCommentsFor("/some/article", callback); assertEquals(1, this.requests.length); this.requests[0].respond(200, { "Content-Type": "application/json" }, '[{ "id": 12, "comment": "Hey there" }]'); expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true; }); }); 

Vea los documentos nise de Sinon para más información.

Para mí, el problema era en realidad la función de descripción, que cuando se proporciona una función de flecha, hace que mocha pierda el tiempo de espera y se comporta de forma no uniforme. (Usando ES6)

ya que no se rechazó ninguna promesa, estaba obteniendo este error todo el tiempo por diferentes pruebas que fallaban dentro del bloque describir

así que esto se ve cuando no funciona correctamente:

 describe('test', () => { assert(...) }) 

y esto funciona usando la función anónima

 describe('test', function() { assert(...) }) 

Espero que ayude a alguien, mi configuración para lo anterior: (nodejs: 8.4.0, npm: 5.3.0, mocha: 3.3.0)

Un poco tarde pero alguien puede usar esto en el futuro … Puede boost el tiempo de espera de su prueba actualizando los scripts en su paquete.json con lo siguiente:

"scripts": { "test": "test --timeout 10000" //Adjust to a value you need }

Ejecute sus pruebas con el comando de test