Отже, я тестую компонент, який спирається на емітер подій. Для цього я придумав рішення, використовуючи Обіцянки з 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();
});
});
На консолі я отримую "UnhandledPromiseRejectionWarning", навіть незважаючи на те, що функція відхилення викликається, оскільки вона миттєво показує повідомлення "AssertionError: Обіцяна помилка"
(вузол: 25754) UnhandledPromiseRejectionWarning: Нерозроблене відхилення обіцянки (ідентифікатор відхилення: 2): AssertionError: Помилка обіцянки: очікується {Об'єкт (повідомлення, showDiff, ...)} неправдивий 1) повинен перейти з правильною подією
А потім, через 2 секунди, я отримую
Помилка: перевищено час очікування 2000 мс. Переконайтеся, що завершено () зворотний виклик у цьому тесті.
Що ще дивніше, оскільки виконується зворотний виклик вилову. (Я думаю, що з певних причин збій утвердження заважав іншій частині виконання)
Тепер найсмішніша річ, якщо я прокоментую assert.isNotOk(error...)
тест, він справляється з будь-яким попередженням на консолі. Це все ще "провалюється" в тому сенсі, що він виконує вилов.
Але все-таки я не можу зрозуміти ці помилки обіцяно. Може хтось мене просвітить?