ดังนั้นฉันกำลังทดสอบส่วนประกอบที่ต้องอาศัยตัวปล่อยเหตุการณ์ เมื่อต้องการทำเช่นนั้นฉันจึงหาวิธีแก้ปัญหาโดยใช้สัญญากับมอคค่า + ชัย:
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();
});
});
บนคอนโซลฉันได้รับ 'UnhandledPromiseRejectionWarning' ถึงแม้ว่าฟังก์ชั่นการปฏิเสธจะถูกเรียกใช้เพราะมันจะแสดงข้อความ 'AssertionError: Promise error' ทันที
(โหนด: 25754) UnhandledPromiseRejectionWarning: การปฏิเสธสัญญาที่ไม่สามารถจัดการได้ (รหัสปฏิเสธ: 2): AssertionError: ข้อผิดพลาดของสัญญา: คาดว่า {วัตถุ (ข้อความ showDiff, ... )} เป็นเท็จ 1) ควรเปลี่ยนด้วยเหตุการณ์ที่ถูกต้อง
หลังจากนั้น 2 วินาทีฉันก็จะได้
ข้อผิดพลาด: เกินหมดเวลาของ 2000ms ตรวจสอบให้แน่ใจว่าการโทรกลับเสร็จสิ้น () ถูกเรียกในการทดสอบนี้
ซึ่งแม้จะแปลกกว่านั้นเนื่องจากการเรียกกลับถูกเรียกใช้ (ฉันคิดว่าด้วยเหตุผลบางอย่างความล้มเหลวในการยืนยันทำให้ส่วนที่เหลือของการเรียกใช้งานไม่ทำงาน)
ตอนนี้สิ่งที่ตลกถ้าฉันแสดงความคิดเห็นassert.isNotOk(error...)
การทดสอบทำงานได้ดีโดยไม่มีการเตือนใด ๆ ในคอนโซล มันยังคง 'ล้มเหลว' ในแง่ที่ว่าจะทำการจับได้
แต่ถึงกระนั้นฉันไม่สามารถเข้าใจข้อผิดพลาดเหล่านี้ด้วยสัญญา ใครบางคนสามารถสอนฉันได้ไหม