Acho que a "solução" de apenas aumentar o tempo limite obscurece o que realmente está acontecendo aqui, que é
- Seu código e / ou chamadas de rede são muito lentas (deve ser inferior a 100 ms para uma boa experiência do usuário)
- As afirmações (testes) estão falhando e algo está engolindo os erros antes que o Mocha possa agir sobre eles.
Você geralmente encontra o número 2 quando o Mocha não recebe erros de asserção de um retorno de chamada. Isso é causado por outro código que engole a exceção ainda mais na pilha. A maneira correta de lidar com isso é corrigir o código e não engolir o erro .
Quando o código externo engole seus erros
Caso seja uma função de biblioteca que você não possa modificar, você precisará capturar o erro de asserção e passá-lo para o Mocha. Você faz isso agrupando seu retorno de chamada de asserção em um bloco try / catch e passa quaisquer exceções para o manipulador concluído.
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);
}
});
});
É claro que este boilerplate pode ser extraído em alguma função de utilidade para tornar o teste um pouco mais agradável aos olhos:
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 testes de rede
Além disso, sugiro que você siga o conselho de começar a usar stubs de teste para chamadas de rede para fazer com que os testes sejam aprovados sem precisar depender de uma rede que funcione. Usando Mocha, Chai e Sinon, os testes podem ser algo como isto
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;
});
});
Veja os nise
documentos de Sinon para mais informações.