当 Promise 拒绝未处理时,Node.js 的默认行为是终止进程。
node:internal/process/promises:288
triggerUncaughtException(err, true /* fromPromise */);
^
[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "argh".] {
code: 'ERR_UNHANDLED_REJECTION'
}
Node.js v18.17.1
然而,在 Mocha 测试期间,这似乎并没有发生。这对我来说是一个问题,因为我正在尝试为一个错误创建回归测试,该错误导致未处理的承诺拒绝终止 Node.js。我无法创建重现此行为的 Mocha 测试。
it('test', () => {
Promise.reject('argh')
})
√ test
1 passing (3ms)
我检查了 Mocha 的代码,试图找出 如何 Mocha 在这种情况下抑制 Node.js 的默认行为,但我无法弄清楚。我知道你可以设置
process.addEventListener('unhandledRejection', ...)
,而 Mocha 确实会这样做,但在该处理程序中,它删除了自己的处理程序并重新发出事件,这应该触发 Node.js 的默认行为 - 但仍然没有任何结果发生。我也找不到任何关于此的 Mocha 文档。
结果会根据你的 mocha 版本而改变,(有一个封闭的问题线程讨论它here)但简短的版本是 Mocha 默认只会吞下未处理的拒绝,只是因为。
有两种简单的方法可以解决这个问题:
unhandled-rejections
模式下使用
strict
运行节点。您可以按照您喜欢的摩卡设置风格格式设置节点环境选项。例如 - .mocharc.json
:{
"node-option": ["unhandled-rejections=strict"]
}
unhandledRejection
事件,并(大概)通过将其添加到测试中来重新抛出错误:process.on('unhandledRejection', (reason) => {
throw reason;
});