使用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
相关产品推荐
相关产品推荐

