Więc testuję komponent, który opiera się na emiterze zdarzeń. Aby to zrobić, wymyśliłem rozwiązanie wykorzystujące Promises z 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();
});
});
Na konsoli otrzymuję komunikat „UnhandledPromiseRejectionWarning”, mimo że wywoływana jest funkcja odrzucania, ponieważ natychmiast wyświetla komunikat „AssertionError: Promise error”
(node: 25754) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): AssertionError: Promise error: oczekiwano, że {Object (message, showDiff, ...)} będzie fałszywy 1) powinien przejść z poprawnym zdarzeniem
A potem po 2 sekundach otrzymuję
Błąd: przekroczono limit czasu 2000 ms. Upewnij się, że wywołanie zwrotne done () jest wywoływane w tym teście.
Co jest jeszcze dziwniejsze, odkąd wykonano wywołanie zwrotne catch (myślę, że z jakiegoś powodu niepowodzenie potwierdzenia uniemożliwiło resztę wykonania)
Zabawne jest to, że jeśli skomentuję, assert.isNotOk(error...)
test przebiega dobrze bez żadnego ostrzeżenia w konsoli. Wciąż „zawodzi” w tym sensie, że wykonuje złapanie.
Ale nadal nie mogę z obietnicą zrozumieć tych błędów. Czy ktoś może mnie oświecić?