Então, estou testando um componente que depende de um emissor de evento. Para isso, criei uma solução usando o Promises com 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();
});
});
No console, estou recebendo um 'UnhandledPromiseRejectionWarning', embora a função de rejeição esteja sendo chamada, pois mostra instantaneamente a mensagem 'AssertionError: Promise error'
(nó: 25754) UnhandledPromiseRejectionWarning: rejeição de promessa sem tratamento (ID de rejeição: 2): AssertionError: erro de promessa: esperado {objeto (mensagem, showDiff, ...)} como falso 1) deve fazer a transição com o evento correto
E então, depois de 2 segundos eu recebo
Erro: tempo limite de 2000ms excedido. Verifique se o retorno de chamada done () está sendo chamado neste teste.
O que é ainda mais estranho desde que o retorno de chamada de captura foi executado (acho que, por algum motivo, a falha de declaração impediu o restante da execução)
Agora, o mais engraçado, se eu comentar, assert.isNotOk(error...)
o teste será executado sem nenhum aviso no console. Ainda "falha" no sentido em que executa a captura.
Ainda assim, não consigo entender esses erros com promessa. Alguém pode me esclarecer?