assert.throws 说 => 缺少预期的异常

Ale*_*lls 2 assert asynchronous node.js

我正在使用这段代码:

       assert.throws(async () => {
            patientSubscriber = await PatientSubscriber.create({
                isSubscribed: true,
                patient: patient._id,
                subscriber: user._id
            });
        },{
             message: /foo/
        });
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到了这个:

断言错误 [ERR_ASSERTION]:缺少预期的异常。

断言 API 是:https : //nodejs.org/api/assert.html#assert_assert_throws_fn_error_message

也许我遇到了这个问题? https://github.com/nodejs/node-v0.x-archive/issues/8368

有谁知道那个错误是关于什么的?

Est*_*ask 9

该错误意味着没有预期的异常。async函数是 promise 的语法糖。他们从不抛出异常,但可能会返回被拒绝的承诺。

由于断言预计是同步的,因此不可能以这种方式断言承诺;整个调用栈应该是基于 Promise 的。

正如评论中提到的那样,assert.rejects出现在 Node 10 中并导致断言失败时拒绝承诺。

如果 promise 由调用者处理(例如在大多数测试框架中),则需要从当前函数返回被拒绝的 promise:

it('...', async () {
  await assert.rejects((async () => {})()); // current function returns rejected promise
});
Run Code Online (Sandbox Code Playgroud)

如果断言承诺没有被处理(例如在生产中),它们会导致UnhandledPromiseRejectionWarning控制台输出,而不是异常。unhandledRejection可以设置处理程序来处理异步错误:

process.on('unhandledRejection', err => {
  console.error(err);
  process.exit(1);
});

...

assert.rejects((async () => {})());
Run Code Online (Sandbox Code Playgroud)

  • 从节点 10.0 开始,似乎有一个 assert.rejects。https://nodejs.org/api/assert.html#assert_assert_rejects_asyncfn_error_message (2认同)