Tôi thấy rằng "giải pháp" của việc chỉ tăng thời gian chờ làm lu mờ những gì đang thực sự xảy ra ở đây, đó là
- Mã và / hoặc các cuộc gọi mạng của bạn quá chậm (nên là 100 ms để có trải nghiệm người dùng tốt)
- Các xác nhận (kiểm tra) đều thất bại và có gì đó đang nuốt các lỗi trước khi Mocha có thể hành động theo chúng.
Bạn thường gặp # 2 khi Mocha không nhận được lỗi xác nhận từ cuộc gọi lại. Điều này được gây ra bởi một số mã khác nuốt ngoại lệ lên ngăn xếp. Cách xử lý đúng đắn này là sửa mã và không nuốt lỗi .
Khi mã bên ngoài nuốt lỗi của bạn
Trong trường hợp đó là chức năng thư viện mà bạn không thể sửa đổi, bạn cần nắm bắt lỗi xác nhận và tự mình chuyển nó sang Mocha. Bạn làm điều này bằng cách gói cuộc gọi lại xác nhận của bạn trong một khối thử / bắt và chuyển bất kỳ ngoại lệ nào cho trình xử lý đã thực hiện.
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);
}
});
});
Bản tóm tắt này tất nhiên có thể được trích xuất thành một số chức năng tiện ích để làm cho bài kiểm tra dễ chịu hơn một chút:
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);
}
}
Tăng tốc kiểm tra mạng
Ngoài ra, tôi khuyên bạn nên nhận lời khuyên về việc bắt đầu sử dụng các cuống thử nghiệm cho các cuộc gọi mạng để thực hiện các thử nghiệm mà không phải phụ thuộc vào mạng hoạt động. Sử dụng Mocha, Chai và Sinon, các bài kiểm tra có thể trông giống như thế này
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;
});
});
Xem tài liệu của Sinonnise
để biết thêm.