そこで、イベントエミッターに依存するコンポーネントをテストしています。そうするために、私はMocha + ChaiでPromisesを使用するソリューションを思いつきました。
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:Promise error」というメッセージが即座に表示されるため、リジェクト関数が呼び出されます。
(node:25754)UnhandledPromiseRejectionWarning:Unhandled promise rejection(rejection id:2):AssertionError:Promise error:expected {Object(message、showDiff、...)} to be falsy 1)should transition with the correct event
そして、2秒後に私は
エラー:2000msのタイムアウトを超えました。このテストでdone()コールバックが呼び出されていることを確認してください。
catchコールバックが実行されたので、これはさらに奇妙です(アサートの失敗により、残りの実行が妨げられたと思います)
面白いことに、コメントアウトするassert.isNotOk(error...)
と、コンソールに警告が表示されずにテストが正常に実行されます。キャッチを実行するという意味では、依然として「失敗」します。
しかし、それでも私はこれらのエラーを約束とともに理解することはできません。誰かが私を啓発できますか?