首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有异步函数的Node.js assert.throws (承诺)

带有异步函数的Node.js assert.throws (承诺)
EN

Stack Overflow用户
提问于 2016-03-03 20:32:53
回答 4查看 14.1K关注 0票数 37

我想检查异步函数是否使用本机assert.throws模块中的assert抛出。我试过

代码语言:javascript
复制
const test = async () => await aPromise();
assert.throws(test); // AssertionError: Missing expected exception..

(很明显?)无法工作,因为函数在承诺被解析之前就退出了。然而,我发现在这个问题中,使用回调实现了同样的目标。

有什么建议吗?

(我正在使用Babel转到Node.js本地生成器。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-22 09:41:52

由于这个问题仍然受到关注,我想总结两个最好的解决方案,特别是突出新的标准方法。

节点v10+

断言库中有一个专用的方法,assert.rejects

对于较早版本的Node

来自vitalets回答的填充

代码语言:javascript
复制
import assert from 'assert';

async function assertThrowsAsync(fn, regExp) {
  let f = () => {};
  try {
    await fn();
  } catch(e) {
    f = () => {throw e};
  } finally {
    assert.throws(f, regExp);
  }
}
票数 3
EN

Stack Overflow用户

发布于 2017-10-26 14:50:35

基于Bergi回答,我提出了更通用的解决方案,使用原始assert.throws来处理错误消息:

代码语言:javascript
复制
import assert from 'assert';

async function assertThrowsAsync(fn, regExp) {
  let f = () => {};
  try {
    await fn();
  } catch(e) {
    f = () => {throw e};
  } finally {
    assert.throws(f, regExp);
  }
}

用法:

代码语言:javascript
复制
it('should throw', async function () {
    await assertThrowsAsync(async () => await asyncTask(), /Error/);
});
票数 21
EN

Stack Overflow用户

发布于 2018-02-01 22:11:45

答案给了我工作,但我今天遇到了这个问题,并想出了另一个解决方案,我认为这是比较简单的。

代码语言:javascript
复制
// Code being tested
async function thisFunctionThrows() {
    throw new Error('Bad response')
}


// In your test.
try {
    await thisFunctionThrows()
    assert.equal(1 == 0) // Never gets run. But if it does you know it didn't throw.
} catch (e) {
    assert(e.message.includes('Bad response'))
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35782435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档