Ich finde, dass die "Lösung", nur die Zeitüberschreitungen zu erhöhen, verdeckt, was hier wirklich vor sich geht
- Ihr Code und / oder Ihre Netzwerkanrufe sind viel zu langsam (sollten für eine gute Benutzererfahrung unter 100 ms liegen).
- Die Behauptungen (Tests) schlagen fehl und etwas verschluckt die Fehler, bevor Mocha darauf reagieren kann.
Normalerweise stoßen Sie auf Nummer 2, wenn Mocha keine Bestätigungsfehler von einem Rückruf erhält. Dies wird durch einen anderen Code verursacht, der die Ausnahme weiter oben im Stapel verschluckt. Der richtige Weg, um damit umzugehen, besteht darin, den Code zu korrigieren und den Fehler nicht zu verschlucken .
Wenn externer Code Ihre Fehler verschluckt
Falls es sich um eine Bibliotheksfunktion handelt, die Sie nicht ändern können, müssen Sie den Assertionsfehler abfangen und selbst an Mocha übergeben. Sie tun dies, indem Sie Ihren Assertion-Rückruf in einen Try / Catch-Block einschließen und alle Ausnahmen an den erledigten Handler übergeben.
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);
}
});
});
Diese Boilerplate kann natürlich in eine Utility-Funktion extrahiert werden, um den Test für das Auge ein wenig angenehmer zu gestalten:
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);
}
}
Beschleunigung von Netzwerktests
Abgesehen davon schlage ich vor, dass Sie die Ratschläge zur Verwendung von Teststubs für Netzwerkanrufe lesen, um Tests zu bestehen, ohne auf ein funktionierendes Netzwerk angewiesen zu sein. Mit Mocha, Chai und Sinon könnten die Tests ungefähr so aussehen
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;
});
});
Siehe Sinon der nise
docs für weitere Informationen.