Me parece que la "solución" de solo aumentar los tiempos de espera oscurece lo que realmente está sucediendo aquí, que es
- Su código y / o llamadas de red son demasiado lentas (deben ser inferiores a 100 ms para una buena experiencia de usuario)
- Las afirmaciones (pruebas) están fallando y algo está tragándose los errores antes de que Mocha pueda actuar sobre ellos.
Por lo general, se encuentra con el n. ° 2 cuando Mocha no recibe errores de aserción de una devolución de llamada. Esto es causado por algún otro código que traga la excepción más arriba en la pila. La forma correcta de lidiar con esto es arreglar 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 usted mismo a Mocha. Para ello, envuelva su devolución de llamada de aserción en un bloque try / catch y pase cualquier excepción al controlador 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);
}
});
});
Por supuesto, esta placa repetitiva se puede 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);
}
}
Acelerar las pruebas de red
Aparte de eso, le sugiero que siga los consejos sobre cómo comenzar a usar los talones de prueba para las llamadas de red para que las pruebas pasen sin tener que depender de una red en funcionamiento. Usando Mocha, Chai y Sinon, las pruebas podrían verse así
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 nise
documentos de Sinon para más información.