You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试Promise是否已被拒绝(无需关注拒绝原因)

如何仅测试Promise是否被拒绝(不关心拒绝原因)

好问题!如果只需要验证Promise是否进入拒绝状态、不需要纠结具体的拒绝原因的话,有几种简洁且规范的写法,我给你整理一下:

方法1:使用rejects.toBeDefined()(Jest)

这种写法直接断言Promise的拒绝状态,只要Promise被拒绝,不管返回什么错误值,都会通过测试:

it('should reject if no startdate is given', () => {
  expect.assertions(1); // 确保异步断言被执行,避免漏测
  return expect(MyService.fetch()).rejects.toBeDefined();
});

方法2:使用rejects.toThrow()(语义化更强)

如果你的Promise拒绝时抛出的是Error对象,用toThrow()会更贴合语义,它不关心错误的具体内容,只要有错误抛出就通过:

it('should reject if no startdate is given', async () => {
  expect.assertions(1);
  await expect(MyService.fetch()).rejects.toThrow();
});

这里用了async/await写法,和返回Promise的效果是一样的,选你习惯的风格就行。

方法3:try-catch 手动捕获(更灵活)

如果你需要在捕获拒绝后做额外操作,也可以用try-catch的方式:

it('should reject if no startdate is given', async () => {
  expect.assertions(1);
  try {
    await MyService.fetch();
    // 如果Promise没被拒绝,走到这里就触发断言失败
    expect(true).toBe(false);
  } catch (err) {
    // 进入catch说明Promise被拒绝,断言通过
    expect(true).toBe(true);
  }
});

重要提示:expect.assertions(1)的作用

别忘了加上这句!它会确保测试中至少有1个断言被执行,避免因为Promise没进入预期状态(比如意外resolve了)而导致测试“假通过”的情况——毕竟异步测试如果没触发断言,Jest默认会认为测试通过,这会隐藏潜在问题。

内容的提问来源于stack exchange,提问作者user1283776

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:12:48