模拟异步API测试关键在于拦截真实请求并返回可控响应,推荐用Jest mock fetch或axios,或直接mock校验函数;需覆盖竞态、防抖、超时等边界场景。

模拟网络请求测试异步 API 接口函数,关键是把真实请求“挡”住,换成可控的响应,让测试只关注逻辑是否正确,不依赖后端服务是否在线、返回是否稳定。
用 Jest 拦截 fetch(推荐,原生且通用)
如果接口基于 fetch(包括 axios 使用 fetch adapter 的情况),直接替换全局 fetch 最轻量:
- 测试前写
global.fetch = jest.fn(),覆盖浏览器原生行为 - 用
mockResolvedValue返回成功响应,比如{ valid: true };用mockRejectedValue模拟网络错误或超时 - 记得在
beforeEach或afterEach中调用fetch.mockClear(),避免上一个测试影响下一个 - 可断言请求参数:比如校验用户名时发的是
/api/check-username?name=abc,就写expect(fetch).toHaveBeenCalledWith(expect.stringContaining('abc'))
Mock axios 实例方法(Vue/React 项目常见)
axios 不走 fetch,需单独 mock 其请求方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 若用默认实例:
jest.mock('axios'),再写axios.get.mockResolvedValue({ data: { valid: false, message: '已存在' } }) - 若封装了自定义 client(如
apiClient),则jest.mock('./api'),并确保该模块导出的是可 mock 的函数或实例 - 多个字段校验(邮箱、手机号)可用不同 URL 或参数区分,分别设置返回值,比如
axios.get.mockImplementation((url) => { if (url.includes('email')) return Promise.resolve({ data: { valid: true } }); ... })
跳过网络层,直接 mock 校验函数(最解耦、适合 TDD)
如果业务逻辑已抽离为独立函数(如 checkUsername(name)),测试时完全不必碰 fetch 或 axios:
立即学习“Java免费学习笔记(深入)”;
- 在测试文件顶部写
jest.mock('../services/validator'),然后checkUsername.mockResolvedValue({ valid: true }) - 这样能专注验证组件行为:比如输入后是否显示 loading、错误提示是否出现、提交按钮是否禁用
- TDD 场景下优势明显:先定义函数签名和返回结构,测试先跑通,再实现真实请求逻辑,全程不依赖后端
覆盖边界场景不能少
真实异步校验常有竞态、防抖、取消等逻辑,测试中要显式模拟:
- 连续快速输入两次用户名,第二次请求应“取消”第一次——可用
AbortController配合 mock,或直接 mock 函数返回不同 resolve 顺序来验证最终状态 - 加防抖时,用
jest.useFakeTimers()控制时间,jest.runAllTimers()触发延迟执行 - 超时兜底:用
Promise.race([realRequest, timeoutPromise])封装后,mock timeoutPromise 被触发,验证错误提示是否展示

















