Promise.all异步测试关键在于控制所有Promise完成时机,需用jest.mock模拟异步函数,验证全成功时结果顺序不变、任一失败则立即reject、并发执行耗时接近单个最长Promise。

Promise.all 的异步测试关键在于**控制所有 Promise 的完成时机**,避免真实网络或定时器干扰,同时验证其并发行为、错误聚合和结果顺序等特性。
用 jest.mock 模拟异步函数
把依赖的异步操作(如 fetch、API 调用)替换成可控的 Promise:
- 用 jest.fn() 返回 resolve 或 reject 的 Promise
- 确保每个 mock 函数返回独立 Promise,避免状态污染
- 示例:const mockApi = jest.fn(() => Promise.resolve({ id: 1 }))
测试正常场景:全部成功
验证 Promise.all 正确收集并保持输入顺序:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 传入多个已 resolve 的 Promise 数组
- 用 await expect(Promise.all([...])).resolves.toEqual([...])
- 注意:即使 Promise 完成顺序不同,Promise.all 结果顺序始终与输入数组一致
测试异常场景:任一失败
Promise.all 遇到第一个 rejected Promise 就立即 reject,其余继续执行但结果被丢弃:
- 构造一个含 reject + 多个 resolve 的数组(如 [Promise.reject('err'), Promise.resolve(2), Promise.resolve(3)])
- 用 await expect(Promise.all([...])).rejects.toEqual('err')
- 可配合 jest.spyOn(console, 'error').mockImplementation(() => {}) 捕获潜在未处理 rejection
测试并发性(可选进阶)
验证多个 Promise 确实并发执行而非串行:
- 给每个 mock 异步函数加计时器(setTimeout(resolve, 10)),并记录开始/结束时间
- 断言总耗时明显小于各 Promise 耗时之和(例如三个 100ms 的 Promise,总耗时应接近 100ms 而非 300ms)
- 注意:仅在需要保障并发语义时才测,多数业务逻辑不需深挖此层

















