unitarias test spec pruebas node framework before async node.js mocha chai

node.js - test - 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



node test before (4)

Encuentro que la "solución" de simplemente aumentar 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 devolución de llamada. Esto es causado por otro código que se traga la excepción más arriba en la pila. 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 devolución de llamada 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.restore(); } 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.

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(); }); }); });


Para llamadas asíncronas, debemos usar la función de devolución de llamada realizada. Si lo pasa en él (), llámalo también done (); de lo contrario, no importa cuánto tiempo de espera aumente, se mantendrá el tiempo de espera. De lo contrario, no lo pases. Si este no es el caso, y hay mucho procesamiento en el caso de prueba, entonces aumentar el valor ayudaría.


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)


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 docs .