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