Promise链式调用测试需验证输入输出、成功/错误路径及边界情况,用Jest mock外部依赖,确保值正确传递、错误冒泡至catch,检查返回值类型对链式延续的影响,避免时间依赖。

Promise 链式调用的测试,核心是验证每一步的输入输出是否符合预期,同时覆盖成功路径、错误路径和边界情况。不需要运行真实网络或定时器,重点在逻辑隔离与可控模拟。
用 Jest 模拟异步函数并断言链式行为
将待测函数中所有外部依赖(如 fetch、自定义 API 函数)全部 mock,返回可控的 Promise:
- 用
jest.fn().mockResolvedValue(data)模拟成功响应 - 用
jest.fn().mockRejectedValue(new Error('xxx'))模拟失败 - 确保每个
.then()的入参来自上一步的返回值,检查中间值是否被正确传递
示例:测试用户→文章链路
(代码片段,非可执行全量)test('should fetch user then posts and return posts array', async () => {
const mockUser = { id: 123, name: 'Alice' };
const mockPosts = [{ id: 1, title: 'Intro' }];
// 模拟两次 fetch 调用
global.fetch = jest.fn()
.mockResolvedValueOnce({ json: () => Promise.resolve(mockUser) })
.mockResolvedValueOnce({ json: () => Promise.resolve(mockPosts) });
await fetchDataChain().then(posts => {
expect(posts).toEqual(mockPosts);
});
});
验证错误冒泡和统一 catch 处理
链中任意一步 reject,必须能被末尾的 .catch() 捕获,且不被中间未处理的 .then() 吞掉:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
立即学习“前端免费学习笔记(深入)”;
- 在第二步
.then()中主动throw new Error('fail'),检查最终.catch()是否收到该错误 - 断言
console.error或错误上报函数是否被调用 - 避免在中间
.then()内写空catch,否则会中断冒泡
检查返回值类型对链式延续的影响
Promise 链能否继续,取决于每个 .then() 回调的返回值:
- 返回普通值(如字符串、对象)→ 自动包装为
Promise.resolve(value) - 返回 Promise → 下一个
.then()等待它 settle 后再执行 - 返回
undefined或没 return → 相当于返回Promise.resolve(undefined)
可在测试中用 expect(...).resolves.toBe(...) 或 await + expect 显式验证每步输出类型。
避免测试“时间依赖”,专注状态流转
不要用 setTimeout 或真实延迟来测链式顺序——这会让测试变慢且不稳定:
- 用
Promise.resolve()或Promise.reject()替代定时器模拟 - 利用 Jest 的
jest.useFakeTimers()仅在必须测 delay 行为时启用 - 重点验证:上一环节 resolve 的值,是否作为参数传入下一环节的回调函数

















