【问题标题】:assert.throws says => Missing expected exceptionassert.throws 说 => 缺少预期的异常
【发布时间】:2019-02-26 05:30:10
【问题描述】:

我正在使用这段代码:

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

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

AssertionError [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

有人知道这个错误是关于什么的吗?

【问题讨论】:

标签: node.js asynchronous assert


【解决方案1】:

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

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

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

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

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

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

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

...

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

【讨论】:

  • 是的,我想我们需要实现assert.rejects,而不是assert.throws
  • 我确信在assert.rejects 上已有尝试,但重要的是当断言失败时应该发生什么。由于assert.rejects 本身不会导致异常,因此它不会使应用程序退出。可能会导致UnhandledPromiseRejectionWarning
  • 自节点 10.0 以来似乎有一个 assert.rejects。 nodejs.org/api/…
  • @Karl-JohanSjögren 感谢您提供信息,很高兴知道。我之前的评论也适用于它,它无法断言像预期的那样抛出,而是会有 UnhandledPromiseRejectionWarning 。一个可能的解决方案可能是自定义 unhandledRejection 处理程序或基于承诺的控制流 await promise.rejects(...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2016-02-09
  • 2014-01-04
  • 1970-01-01
  • 2010-10-17
  • 2020-01-05
  • 2021-02-12
相关资源
最近更新 更多