Uważam, że „rozwiązanie” polegające na zwiększeniu limitów czasowych zaciemnia to, co naprawdę się tutaj dzieje, co też jest
- Twój kod i / lub połączenia sieciowe są zbyt wolne (powinny być mniejsze niż 100 ms, aby zapewnić dobrą obsługę)
- Twierdzenia (testy) zawodzą i coś połyka błędy, zanim Mocha będzie w stanie na nie zareagować.
Zazwyczaj napotykasz numer 2, gdy Mocha nie otrzymuje błędów potwierdzenia od oddzwonienia. Jest to spowodowane tym, że jakiś inny kod połyka wyjątek na górze stosu. Prawidłowym sposobem radzenia sobie z tym jest naprawienie kodu, a nie połknięcie błędu .
Gdy kod zewnętrzny połyka błędy
Jeśli jest to funkcja biblioteki, której nie możesz zmodyfikować, musisz złapać błąd asercji i sam przekazać go Mocha. Robisz to, zawijając swoje wywołanie zwrotne asercji w bloku try / catch i przekazując wszelkie wyjątki do gotowej procedury obsługi.
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);
}
});
});
Tę płytę kotłową można oczywiście wyodrębnić do jakiejś funkcji użytkowej, aby uczynić test nieco bardziej przyjemnym dla oka:
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);
}
}
Przyspieszenie testów sieciowych
Poza tym sugeruję, abyś zapoznał się z poradami na temat rozpoczynania używania kodów testowych do połączeń sieciowych w celu przeprowadzenia testów bez konieczności polegania na działającej sieci. W przypadku Mocha, Chai i Sinon testy mogą wyglądać mniej więcej tak
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;
});
});
Zobacz dokumentację Sinona,nise
aby uzyskać więcej informacji.