Mocha 如何/为何抑制未处理的承诺拒绝,以及如何阻止它这样做?

问题描述 投票:0回答:1

当 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 文档。

  1. Mocha 如何抑制未处理的 Promise 拒绝?还有,为什么?这是一个错误吗?
  2. 有什么方法可以配置 Mocha 来停止这样做吗?
node.js promise mocha.js
1个回答
0
投票

结果会根据你的 mocha 版本而改变,(有一个封闭的问题线程讨论它here)但简短的版本是 Mocha 默认只会吞下未处理的拒绝,只是因为。

有两种简单的方法可以解决这个问题:

  1. unhandled-rejections
    模式
    下使用
    strict
    运行节点。您可以按照您喜欢的摩卡设置风格格式设置节点环境选项。例如 -
    .mocharc.json
    :
{
  "node-option": ["unhandled-rejections=strict"]
}
  1. 监听节点进程中的
    unhandledRejection
    事件
    ,并(大概)通过将其添加到测试中来重新抛出错误:
process.on('unhandledRejection', (reason) => {
  throw reason;
});
© www.soinside.com 2019 - 2024. All rights reserved.