Vì vậy, tôi đang thử nghiệm một thành phần dựa trên trình phát sự kiện. Để làm như vậy, tôi đã đưa ra một giải pháp bằng cách sử dụng Promising với Mocha + Chai:
it('should transition with the correct event', (done) => {
const cFSM = new CharacterFSM({}, emitter, transitions);
let timeout = null;
let resolved = false;
new Promise((resolve, reject) => {
emitter.once('action', resolve);
emitter.emit('done', {});
timeout = setTimeout(() => {
if (!resolved) {
reject('Timedout!');
}
clearTimeout(timeout);
}, 100);
}).then((state) => {
resolved = true;
assert(state.action === 'DONE', 'should change state');
done();
}).catch((error) => {
assert.isNotOk(error,'Promise error');
done();
});
});
Trên bảng điều khiển, tôi nhận được một 'UnhandledPromiseRejectionWarning' mặc dù chức năng từ chối đang được gọi vì nó ngay lập tức hiển thị thông báo 'AssertsError: Promise error'
(nút: 25754) UnhandledPromiseRejectionWarning: Từ chối lời hứa chưa được xử lý (id từ chối: 2): AssertsError: Lỗi hứa hẹn: dự kiến {Object (tin nhắn, showDiff, ...)} sẽ chuyển đổi với sự kiện chính xác
Và sau 2 giây tôi nhận được
Lỗi: quá thời gian chờ 2000ms. Đảm bảo gọi lại thực hiện () đang được gọi trong thử nghiệm này.
Điều này thậm chí còn kỳ lạ hơn kể từ khi cuộc gọi lại bắt được thực thi. (Tôi nghĩ rằng vì một số lý do, sự thất bại khẳng định đã ngăn cản phần còn lại của việc thực hiện)
Bây giờ điều buồn cười, nếu tôi nhận xét assert.isNotOk(error...)
bài kiểm tra chạy tốt với bất kỳ cảnh báo nào trong bảng điều khiển. Nó vẫn "thất bại" theo nghĩa là nó thực hiện việc bắt.
Nhưng tôi vẫn không thể hiểu những lỗi này bằng lời hứa. Ai đó có thể khai sáng cho tôi?