Quindi, sto testando un componente che si basa su un emettitore di eventi. Per fare ciò ho trovato una soluzione usando Promises with 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();
});
});
Sulla console ricevo un "UnhandledPromiseRejectionWarning" anche se viene chiamata la funzione di rifiuto poiché mostra immediatamente il messaggio "AssertionError: Promise error"
(nodo: 25754) UnhandledPromiseRejectionWarning: rifiuto della promessa non gestita (ID rifiuto: 2): errore di asserzione: errore di promessa: previsto {oggetto (messaggio, showDiff, ...)} errato 1) dovrebbe passare con l'evento corretto
E poi, dopo 2 secondi, ottengo
Errore: superamento del timeout di 2000 ms. Assicurarsi che il callback done () venga chiamato in questo test.
Il che è ancora più strano da quando è stato eseguito il callback catch (penso che per qualche motivo il fallimento dell'asserzione abbia impedito il resto dell'esecuzione)
Ora la cosa divertente, se commento assert.isNotOk(error...)
il test, va bene senza alcun avvertimento nella console. Resta "fallito", nel senso che esegue la cattura.
Tuttavia, non riesco a capire questi errori con la promessa. Qualcuno può illuminarmi?