首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在未处理的promise rejection中测试抛出

在未处理的 Promise rejection 中测试抛出异常的方法有以下几种:

  1. 使用 try-catch 块:在测试代码中,可以使用 try-catch 块来捕获未处理的 Promise rejection,并验证是否抛出了预期的异常。在 try 块中,可以编写代码触发 Promise rejection,然后在 catch 块中断言异常的类型和内容。例如:
代码语言:txt
复制
try {
  // 触发 Promise rejection
  await Promise.reject(new Error('Expected rejection'));
  // 断言不会执行到这里
  assert.fail('Promise rejection not thrown');
} catch (error) {
  // 断言异常类型和内容
  assert.strictEqual(error.message, 'Expected rejection');
}
  1. 使用 async 函数和 assert.rejects 方法:Node.js 提供了 assert.rejects 方法,可以方便地测试 Promise rejection。在测试代码中,可以使用 async 函数和 assert.rejects 方法来验证是否抛出了预期的异常。例如:
代码语言:txt
复制
// 使用 async 函数包装测试代码
async function test() {
  // 使用 assert.rejects 断言 Promise rejection
  await assert.rejects(
    // 触发 Promise rejection
    Promise.reject(new Error('Expected rejection')),
    // 断言异常类型和内容
    { message: 'Expected rejection' }
  );
}

// 执行测试函数
test().catch((error) => {
  // 捕获测试中的异常
  console.error(error);
  process.exit(1);
});
  1. 使用第三方库:除了上述方法,还可以使用一些第三方库来简化测试未处理的 Promise rejection。例如,chai-as-promised 是一个流行的断言库,可以方便地测试 Promise rejection。使用该库,可以通过链式调用 rejectedWith 方法来断言 Promise rejection 的类型和内容。例如:
代码语言:txt
复制
const { expect } = require('chai');
const chaiAsPromised = require('chai-as-promised');

// 使用 chai-as-promised 插件
chai.use(chaiAsPromised);

// 测试代码
it('should throw expected rejection', async () => {
  // 触发 Promise rejection,并断言异常类型和内容
  await expect(Promise.reject(new Error('Expected rejection')))
    .to.be.rejectedWith('Expected rejection');
});

以上是几种常见的方法来测试未处理的 Promise rejection。根据具体的测试框架和需求,可以选择适合的方法来验证代码中是否正确处理了 Promise rejection。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NodeJS中的异步编程经验

在 Node.js 6.6.0 中增加了一个特性:对 Promise 中未处理的 rejection 默认会输出 UnhandledPromiseRejectionWarning 提示 例如:test.js...中有如下代码: node test.js 执行: 另一种情况是直接在 Promise 中抛出异常: 执行后也会有 UnhandledPromiseRejectionWarning 的警告:...Promise API 中有 .catch() 这个方法,可以用来处理捕捉 rejection 进行处理 但是注意: 这个例子中虽然用 .catch() 捕捉处理了 Promise 中的...rejection;但是注意在 err.message 中的 err 是未定义的,代码执行时会抛出错误,由于没有后续的处理,所以也会输出 UnhandledPromiseRejectionWarning...unhandledRejection 事件 在 node process 中有一个 unhandledRejection 事件,当没有对 Promise 的 rejection 进行处理就会抛出这个事件

1.8K20

【JavaScript】 事件循环 —— 微任务 Microtask

如 规范[1] 中所述: 队列(queue)是先进先出的:首先进入队列的任务会首先运行。 只有在 JavaScript 引擎中没有其它任务在运行时,才开始执行任务队列中的任务。...未处理的 rejection 还记得 使用 promise 进行错误处理[2] 一章中的 unhandledrejection 事件吗?...现在,我们可以确切地看到 JavaScript 是如何发现未处理的 rejection 的。...如果一个 promise 的 error 未被在微任务队列的末尾进行处理,则会出现“未处理的 rejection”。...但是现在我们知道了,当微任务队列中的任务都完成时,才会生成 unhandledrejection:引擎会检查 promise,如果 promise 中的任意一个出现 "rejected" 状态,unhandledrejection

49210
  • then, catch, finally如何影响返回的Promise实例状态

    occurred, and the reason is: ', reason) }) 如果onFulfilled或onRejected中抛出一个异常,那么.then返回的Promise实例的状态会变成...onRejected回调中抛出了异常,那么.catch返回的Promise实例的状态也将变成rejected。...实例的状态也取决于onFinally的返回值是什么,以及onFinally中是否抛出异常。...如果回调函数中抛出了异常,那么.then, .catch或.finally返回的Promise实例的状态就是rejected,并且reason是所抛出异常的对象e。...如何理解then中抛出异常后会触发随后的catch 由于.then会返回一个新的Promise实例,而在.then回调中抛出了异常,导致这个新Promise的状态变成了rejected,而.catch正是用于处理这个新的

    1.2K10

    Node 脚本遭遇异常时如何安全退出

    在一些重要流程中能够看到脚本的身影: CI,用以测试、质量保障及部署等 Docker,用以构建镜像 Cron,用以定时任务 如果在这些重要流程中脚本出错无法及时发现问题,将有可能引发更加隐蔽的问题。...❞ exit code 代表一个进程的返回码,通过系统调用 exit_group 来触发。在 POSIX 中,0 代表正常的返回码,1-255 代表异常返回码,一般主动抛出的错误码都是 1。...1 throw new Error 与 Promise.reject 区别 以下是两段代码,第一段抛出一个异常,第二段 Promise.reject,两段代码都会如下打印出一段异常信息,那么两者有什么区别...在对上述两个测试用例使用 echo $? 查看 exit code,我们会发现 throw new Error() 的 exit code 为 1,而 Promise.reject() 的为 0。...(rejection id: 1) ❞ 根据提示,--unhandled-rejections=strict 将会把 Promise.reject 的退出码设置为 1,并在将来的 node 版本中修正

    1.8K30

    一个 Node 进程的死亡与善后

    在一些重要流程中能够看到脚本的身影: CI,用以测试、质量保障及部署等 Cron,用以定时任务 Docker,用以构建镜像 如果在这些重要流程中脚本出错无法及时发现问题,将有可能引发更加隐蔽的问题。...在 POSIX 中,0 代表正常的返回码,1-255 代表异常返回码,在业务实践中,一般主动抛出的错误码都是 1。...52 未曾感知的痛苦何在: throw new Error 与 Promise.reject 区别 以下是两段代码,第一段抛出一个异常,第二段 Promise.reject,两段代码都会如下打印出一段异常信息...= 1 }) 在构建镜像时,Node 也有关于异常解决方案的建议: (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection...(rejection id: 1) 根据提示,--unhandled-rejections=strict 将会把 Promise.reject 的退出码设置为 1,并在将来的 node 版本中修正 Promise

    1.1K20

    异步函数中的异常处理及测试方法

    这是对它的测试(使用Jest): ? 也可以从 ES6 的类中抛出错误。在 Javascript 中编写类时,我总会在构造函数中输入意外值。下面是一个例子: ? 以下是该类的测试: ?...测试确实通过了: ? 安排的明明白白! 所以无论异常是从常规函数还是从类构造函数(或从方法)抛出的,一切都会按照预期工作。 但是如果我想从异步函数中抛出错误怎么办?...果然不出所料,异步方法返回了一个Promise rejection,从严格意义上来讲,并没有抛出什么东西。错误被包含在了Promise rejection中。...被拒绝的Promise将会在堆栈中传播,除非你抓住(catch)它。 至于测试代码,应该这样写: ? 我们测试的不能是普通的异常,而是带有TypeError的rejects。 现在测试通过了: ?...这就是它的工作原理。 总结 最后总结一下: 从异步函数抛出的错误不会是“普通的异常”。 异步函数和异步方法总是返回一个Promise,无论是已解决还是被拒绝。

    3K30

    你没有抓住 Promises 的要点

    rejection 部分的代码就像同步代码的副本一样,在整个调用链中,fulfillment 部分会执行,也会在某个时候被 rejection 中断,但是只有预先声明了的 handler 才能处理它。...handler 抛出了异常:获取数据,然后再抛出异常 数据装填失败,rejection handler 返回了一个值:必须得用一个 catch 子句捕获异常并处理 数据装填失败,但是 rejection...如果你在某个 handler 里面写一个叫做 aFunctionThatDoesNotExist() 的函数,你的 promise 对象失败以后会抛出异常,接着你的异常向上冒泡,外面最近的一个 rejection...这个测试套件发布以后,promise 操作性和可理解性都有了进步。rsvp.js 发布的其中一个目标就是要提供对 Promises/A 的支持。...不过最棒的是这个 Promises/A+组织的开源项目,一个松耦合的实现,用清晰的和测试完备的方式呈现扩展了原有 Promises/A 规范,成为 Promises/A+规范。

    62110

    一文详聊前端异常原理

    TypeError TypeError 在对值进行不合理操作时会发生,比如试图对一个非函数类型的值进行函数调用,或者引用 null 或 undefined 类型的值中的属性,那么引擎会抛出这种类型的异常...断言 上文提到可预测,很容易联想到 Node 中的断言 assert,如果表达式不符合预期,就抛出一个错误。...会用于编写测试用例; 不过 ECMA 还没有类似的设计,感兴趣可以简单封装一个 assert 方法。...主要注意的是,Promise 的 catch 方法用于处理 rejected 状态,而非处理异常。Rejected 状态未处理的话会触发 Uncaught Rejection....来捕获接口状态 总结 本文详细讲解了 ECMA 中 8 种异常的产生原理,涉及了 LHS&RHS、递归优化、ScriptError、finally、Promise 等知识点,希望在处理异常的工作中能给你带来帮助

    1.5K40

    JS原生引用类型解析7-Promise类型

    该函数有一个参数,即拒绝的原因(the rejection reason)。 返回值: then方法返回一个Promise。...而它的行为与then中的回调函数的返回值有关: 如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。...如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。...如果调用 then 的 Promise 的状态(fulfillment 或 rejection)发生改变,但是 then 中并没有关于这种状态的回调函数,那么 then 将创建一个没有经过回调函数处理的新...}); // 在异步函数中抛出的错误不会被catch捕获到 var p2 = new Promise(function(resolve, reject) { setTimeout(function

    1.4K10

    Vue项目处理错误上报如此简单

    Vue 应用中的错误(如组件生命周期中的错误、自定义事件处理函数内部错误、v-on DOM 监听器内部抛出的错误),并且回调中自带的 info 参数也标记了这个错误大概是属于哪类,同时它还能处理返回...Promise 链的错误,可以说是非常强大了,但是它也并非能处理所有的异常,否则文章写到这就该结束了 ~ 接下来我们测试一下。..._handled = true return ret.catch((e) => errorHandler(e, this, `捕获到了未处理的Promise异常: (Promise..._handled = true return ret.catch((e) => errorHandler(e, this, `捕获到了未处理的Promise异常: (Promise...本文介绍了如何简单地在 Vue 中全局捕获异常错误,提升代码健壮性,且能避免在代码中编写大量异常捕获块,同时也减少了出错时控制台的大片飘红报警,收集错误可以帮助我们定位开发与测试阶段不易发现的疑难杂症,

    1.4K21

    面试官:为什么Promise中的错误不能被trycatch?

    前言 之前我写过一篇文章,讨论了为什么async await中的错误可以被try catch,而setTimeout等api不能,有小伙伴提出之前面试被面试官问过为什么Promise的错误不能try catch...异步处理在我们日常开发中是很常见的场景,在Promise出现之前,我们都是通过回调来处理异步代码的结果,但是出现了一些问题: 回调地狱,在有多个异步逻辑存在依赖关系时,我们只能在回调里嵌套,这些深度嵌套的代码让代码难以阅读和维护...如果p1变成了rejected,我们注册的handler不会被调用,p2直接变成rejected,rejection reason就是p1的rejection reason。...简单来说就是,它就像finally块一样,不能包含return,它可以抛出异常,但是不能返回新的值。...如果允许异常向外抛出,那我们该怎么恢复后续Promise的执行?比如Promise a出现异常了,异常向外抛出,外面是没办法改变Promise a的数据的。

    1.6K30

    关于 JavaScript 错误处理的最完整指南(下半部)

    , error, 和 throw 使用 Promise.reject 可以很方便的抛出错误: Promise.reject(TypeError("Wrong type given, expected a...string")); 除了Promise.reject,我们也可以通过抛出异常来退出 Promise。...如果我们失败了,或者决定不捕获它,异常可以在堆栈中自由冒泡。 使用 Promise 来处理定时器中的异常 使用定时器或事件无法捕获从回调引发的异常。...在这一点上,我们可以: 简单的把对象错误打出来 抛出错误 把错误传到另一个回调 我们可以抛出一个异常 const { readFile } = require("fs"); function readDataset...在JavaScript程序中,可以通过多种方式来捕获异常。 同步代码中的异常是最容易捕获的。相反,异步中的异常需要一些技巧来处理。

    2.3K20

    有了承诺之后,没完成,需要处理

    Promise 在错误处理方面非常出色。当 promise 拒绝时,控件跳转到最近的拒绝处理程序。这在实践中很方便。...“看不见的try..catch,执行程序会自动捕获错误并将其转换为被拒绝的Promise。 这不仅发生在executor函数中,也发生在其处理程序中。...在定期的尝试中…我们可以分析错误,如果不能处理,可能会重新抛出错误。同样的事情也可能发生在承诺上。 如果我们在.catch中抛出,那么控件将转到下一个最近的错误处理程序。...在出现错误的情况下,承诺被拒绝,执行应该跳转到最近的拒绝处理程序。但是没有。所以错误被“卡住”了。没有代码来处理它。 在实践中,就像代码中的常规未处理错误一样,这意味着某些东西出现了严重的错误。...通常这种错误是不可恢复的,所以我们最好的解决方法是通知用户这个问题,并可能向服务器报告这个事件。 在非浏览器环境中,如Node。还有其他方法可以跟踪未处理的错误。

    1.3K20
    领券