最佳答案
我在测试一个依赖于事件发射器的组件。为了做到这一点,我想出了一个解决方案,使用“摩卡 + 印度茶的承诺”:
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();
});
});
在控制台上,我得到了一个‘ Unhandled 种承诺拒绝警告’,尽管拒绝函数被调用,因为它立即显示消息‘ AssertionError: 承诺错误’
(node: 25754)未处理的承诺拒绝警告: 未处理的承诺 拒绝(拒绝 id: 2) : 断言错误: 承诺错误: 预期 { Object (message,showDiff,...)}为 false
- 应该与正确的事件转换
然后,两秒钟之后
错误: 超时2000ms。请确保 done ()回调为 在这次测试中被召唤。
由于 catch 回调被执行(我认为由于某种原因断言失败阻止了其余的执行) ,这种情况更加奇怪
有趣的是,如果我注释掉 assert.isNotOk(error...)
,测试在控制台没有任何警告的情况下运行得很好。在执行 catch 的意义上,它仍然“失败”。
但是,我仍然不能理解这些错误与承诺。有人可以启发我吗?