You need to enable JavaScript to run this app. 使用Jest测试预期失败的Promise时纯Promise写法不生效问题
优惠活动
大模型
产品
解决方案
定价
更多

使用Jest测试预期失败的Promise时纯Promise写法不生效问题

问题根本原因

你遇到的问题核心是:manyUrls 接收到字符串参数时,错误是同步抛出的,根本没有走到返回Promise的逻辑里:

  • 字符串没有map方法,执行urls.map时会立刻同步抛出TypeError,不会生成后续的Promise实例
  • 你写的manyUrls(url).catch(...)里,manyUrls(url)调用直接崩溃,catch回调根本没机会挂载,未捕获的同步错误直接导致测试失败

为什么async/await写法可以正常运行

你注释的async/await代码用了try/catch包裹整个manyUrls调用逻辑,try块可以捕获内部的所有同步、异步错误,因此同步抛出的TypeError也能被正常catch到,符合断言要求。

纯Promise写法的修复方案

你只需要把manyUrls的调用包进Promise的异步回调上下文里,同步抛出的错误会被Promise链自动捕获为rejected状态,就能触发后续的catch逻辑:

test('Expect TypeError if a single string is passed', () => {
  expect.assertions(1);
  // 用Promise.resolve包一层,将同步调用转为Promise回调内的异步调用
  return Promise.resolve()
    .then(() => manyUrls(url))
    .catch(e => expect(e).toBeInstanceOf(TypeError))
})

也可以选择优化manyUrls的参数校验逻辑,从根源统一错误输出形式,优化后原来的纯Promise测试代码可以直接正常运行:

// 优化后的index.js
const manyUrls = (urls) => {
  // 提前做参数校验,返回rejected Promise,统一错误形式
  if (!Array.isArray(urls)) {
    return Promise.reject(new TypeError('urls must be an array'))
  }
  return Promise.all(urls.map(url => fetch(url)))
    .then(responses => Promise.all(responses.map(res => res.json())))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:00:00