Итак, я тестирую компонент, который опирается на источник событий. Для этого я предложил решение, использующее Promises с 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: необработанное обещание отклонение (id отклонения: 2): AssertionError: ошибка обещания: ожидается {Object (message, showDiff,...)} быть ложным 1) должен перейти с правильным событием
И затем, через 2 секунды, я получаю
Ошибка: превышено время ожидания 2000 мс. Убедитесь, что обратный вызов done() вызывается в этом тесте.
Что еще более странно, поскольку был выполнен обратный вызов catch (я думаю, что по какой-то причине ошибка assert помешала завершению выполнения)
Самое смешное, если я закомментирую assert.isNotOk(error...)
, тест будет работать без всякого предупреждения в консоли. Он по-прежнему "терпит неудачу" в том смысле, что выполняет задание.
Но все же я не могу понять эти ошибки с обещанием. Может ли кто-нибудь просветить меня?