因此,我正在测试依赖于事件发射器的组件。为此,我想出了将Promises与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();
});
});
在控制台上,尽管正在调用拒绝函数,但我仍收到“ UnhandledPromiseRejectionWarning”消息,因为它会立即显示消息“ AssertionError:Promise错误”
(节点:25754)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):AssertionError:Promise错误:预期{对象(消息(showDiff,...)}虚假1)应以正确的事件进行转换
然后2秒后
错误:超时超过2000毫秒。确保此测试中正在调用done()回调。
自从执行catch回调以来,这甚至更奇怪(我认为由于某种原因断言失败阻止了其余的执行)
现在,有趣的是,如果我将其注释掉,assert.isNotOk(error...)
则测试运行正常,控制台中没有任何警告。就执行捕获而言,它仍然“失败”。
但是,尽管如此,我还是无法理解这些错误。有人可以启发我吗?