【发布时间】:2017-02-04 14:35:10
【问题描述】:
所以,我正在测试一个依赖于事件发射器的组件。为此,我想出了一个使用 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 error”
(node:25754) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝(拒绝 id:2):AssertionError:承诺错误:预期 { Object (message, showDiff, ...) } 是假的
- 应该使用正确的事件进行转换
然后,2秒后我得到
错误:超过 2000 毫秒的超时。确保 done() 回调是 在这个测试中被调用。
自从执行了 catch 回调之后就更奇怪了(我认为由于某种原因,断言失败阻止了其余的执行)
现在有趣的是,如果我将assert.isNotOk(error...) 注释掉,测试运行良好,控制台中没有任何警告。在执行捕获的意义上,它仍然“失败”。
但是,我仍然无法用承诺来理解这些错误。有人能启发我吗?
【问题讨论】:
-
我认为您在最后一行有一组额外的右括号和括号。请删除它们并重试。
-
这太酷了,新的未处理拒绝警告可以发现现实生活中的错误并节省人们的时间。在这里赢了这么多。如果没有此警告,您的测试将在没有任何解释的情况下超时。
标签: javascript node.js promise mocha.js chai