NodeJS UnhandledPromiseRejection警告

因此,我正在测试依赖于事件发射器的组件。为此,我想出了将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”

(节点:25754)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):AssertionError:Promise错误:预期{对象(消息(showDiff,…)}虚假1)应以正确的事件进行转换

然后2秒后

错误:超时超过2000毫秒。确保在此测试中调用了done()回调。

自从执行catch回调以来,这甚至更奇怪(我认为由于某种原因断言失败阻止了其余的执行)

现在,有趣的是,如果我将其注释掉,assert.isNotOk(error...)则测试运行正常,控制台中没有任何警告。就执行捕获而言,它仍然“失败”。

但是,我还是无法理解这些错误。有人可以启发我吗?

回答:

此问题是由以下原因引起的:

.catch((error) => {

assert.isNotOk(error,'Promise error');

done();

});

如果断言失败,它将引发错误。该错误将done()永远不会被调用,因为代码在此之前出错。这就是导致超时的原因。

“未处理的承诺拒绝” 也由断言失败造成的,因为如果一个错误在被抛出catch()的处理程序,

并没有后续的catch()处理程序,错误将得到吞噬(说明这篇文章)。该UnhandledPromiseRejectionWarning警告提醒你这个事实。

通常,如果要在Mocha中测试基于承诺的代码,则应依靠Mocha本身已经可以处理承诺的事实。您不应该使用done(),而是从测试中返回一个承诺。摩卡咖啡然后会自己捕获任何错误。

像这样:

it('should transition with the correct event', () => {

...

return new Promise((resolve, reject) => {

...

}).then((state) => {

assert(state.action === 'DONE', 'should change state');

})

.catch((error) => {

assert.isNotOk(error,'Promise error');

});

});

以上是 NodeJS UnhandledPromiseRejection警告 的全部内容, 来源链接: utcz.com/qa/415855.html

回到顶部