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

时间:2018-09-21 19:19:16

标签: node.js asynchronous assert

我正在使用这段代码:

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

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

  

AssertionError [ERR_ASSERTION]:缺少预期的异常。

assert API为: https://nodejs.org/api/assert.html#assert_assert_throws_fn_error_message

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

有人知道该错误是什么吗?

1 个答案:

答案 0 :(得分:2)

该错误表示在预期的时间内没有异常。 async函数是诺言的语法糖。他们从不抛出异常,但可能会返回被拒绝的承诺。

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

正如评论中提到的,assert.rejects出现在节点10中,导致断言失败时被拒绝的诺言。

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

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

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

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

...

assert.rejects((async () => {})());