Saya menemukan bahwa "solusi" hanya dengan meningkatkan timeout mengaburkan apa yang sebenarnya terjadi di sini, yang merupakan salah satunya
- Kode dan / atau panggilan jaringan Anda terlalu lambat (seharusnya sub 100 ms untuk pengalaman pengguna yang baik)
- Pernyataan (tes) gagal dan ada sesuatu yang menelan kesalahan sebelum Mocha mampu menindaklanjutinya.
Anda biasanya menemukan # 2 ketika Mocha tidak menerima kesalahan pernyataan dari panggilan balik. Ini disebabkan oleh beberapa kode lain yang menelan pengecualian lebih lanjut di stack. Cara yang tepat untuk menangani ini adalah memperbaiki kode dan tidak menelan kesalahan .
Ketika kode eksternal menelan kesalahan Anda
Jika fungsi pustaka yang tidak dapat Anda modifikasi, Anda perlu menangkap kesalahan pernyataan dan meneruskannya ke Mocha sendiri. Anda melakukan ini dengan membungkus panggilan balik pernyataan Anda dalam blok coba / tangkap dan berikan pengecualian apa pun kepada penangan yang sudah selesai.
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);
}
});
});
Pelat ini tentu saja dapat diekstraksi menjadi beberapa fungsi utilitas untuk membuat tes ini sedikit lebih menyenangkan bagi mata:
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);
}
}
Mempercepat tes jaringan
Selain itu saya sarankan Anda mengambil saran tentang mulai menggunakan test bertopik untuk panggilan jaringan untuk membuat tes lulus tanpa harus bergantung pada jaringan yang berfungsi. Menggunakan Mocha, Chai dan Sinon tes mungkin terlihat seperti ini
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;
});
});
Lihat dokumen Sinonnise
untuk info lebih lanjut.