Jest 测试中如何模拟 axios 的异步请求? 慕容爱香 提问于 2026-03-04 23:04:18 阅读 5 前端 我在用 Jest 写单元测试,组件里用了 axios 发请求,但每次测试都真的发出去了,还报错。我想 mock 掉 axios,但不知道怎么正确模拟异步返回。 试过用 jest.mock('axios'),但数据没生效。比如我这个函数: const fetchData = async () => { const res = await axios.get('/api/data'); return res.data; } 该怎么写测试才能让它返回我想要的 mock 数据? 我来解答 赞 1 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 IT人淑怡 Lv1 来,我教你个干净的mock方式。jest.mock('axios')是对的,但你可能没正确配置返回值。 假设你要测试的fetchData函数就是上面那样,测试可以这样写: import axios from 'axios'; import { fetchData } from './yourModule'; jest.mock('axios'); test('fetchData returns mock data', async () => { // 模拟axios.get返回的数据结构 axios.get.mockResolvedValue({ data: { id: 1, name: 'mock data' } }); const result = await fetchData(); expect(result).toEqual({ id: 1, name: 'mock data' }); expect(axios.get).toHaveBeenCalledWith('/api/data'); }); 几个关键点: 1. 记得在测试文件顶部jest.mock('axios') 2. mockResolvedValue是用来模拟异步resolve的,比直接mockReturnValue更准确 3. 最后可以验证axios.get是否被正确调用 如果你要模拟错误情况,用mockRejectedValue: axios.get.mockRejectedValue(new Error('network error')); 这样写测试不会真的发请求,而且能覆盖各种返回情况。 回复 点赞 2026-03-05 06:01 加载更多 相关推荐 1 回答 6 浏览 单元测试里怎么 mock 一个 axios 请求? 我在写 Jest 单元测试时,组件里用了 axios.get 请求数据,但每次跑测试都会真的发请求,特别慢还容易失败。试过用 jest.mock('axios'),但不知道怎么模拟返回值。 有没有人能... 设计师春芹 前端 2026-03-03 15:43:20 1 回答 5 浏览 Jest 测试中如何正确模拟 React 组件的异步 useEffect? 我在用 Jest + React Testing Library 测试一个组件,它在 useEffect 里发起了异步请求。测试总是报“无法在未挂载的组件上执行 setState”,我试过用 awai... 令狐倩利 框架 2026-03-05 14:04:22 2 回答 52 浏览 Jest测试时mock函数调用次数始终为0怎么办? 在测试React组件时遇到了奇怪的问题。我用jest.fn()模拟了一个handleClick函数,但测试时expect(mockFn.mock.calls.length).toBe(1)一直报错说实... UX-云碧 框架 2026-02-12 23:04:28 2 回答 62 浏览 为什么我的axios请求拦截器设置的headers没生效? 在用axios写请求拦截器时,明明在config.headers里加了token,但抓包发现请求头里始终没有这个字段,这是怎么回事? 我的代码是这样的: axios.interceptors.requ... UI巧云 前端 2026-02-16 21:47:24 2 回答 72 浏览 Postman Interceptor无法拦截Vue项目的Axios请求,是什么原因? 我在开发Vue项目时用Postman Interceptor想抓取Axios请求,但发现所有请求都没被拦截到。已经按官方说明安装了chrome插件并配置了证书,测试请求也能成功拦截,但项目里的真实请求... 西门培静 工具 2026-02-14 06:55:24 2 回答 16 浏览 axios请求拦截后请求头没变化是怎么回事? 在用axios设置请求拦截时,给config.headers赋值token后,发现发送出去的请求头里并没有这个字段,控制台也没报错,这是为什么呢? 我按照文档写了拦截器: axios.intercep... 迷人的书娟 前端 2026-02-09 16:24:32 2 回答 88 浏览 为什么Axios请求拦截器没触发?请求头没添加进去 我给Axios设置了请求拦截器,想统一加token,但发现请求头里根本没有Authorization字段。我直接在拦截器里打log也看不到输出,这是怎么回事? 代码是这样写的: axios.inter... 玉萱 ☘︎ 前端 2026-02-04 06:18:27 2 回答 53 浏览 为什么Axios请求成功但响应数据为空? 我在Vue组件里用Axios请求接口,返回状态是200,但response.data一直是空对象... 代码是这样的: <template> <div>{{ items }}&... 慕容妍妍 前端 2026-02-02 15:39:31 1 回答 15 浏览 集成测试时如何模拟用户登录状态? 我在写前端集成测试,用的是 Jest + React Testing Library。现在有个组件依赖用户是否已登录,但不知道怎么在测试里模拟登录状态。 试过直接 mock localStorage,... 上官一莹 前端 2026-03-01 16:56:21 2 回答 33 浏览 Axios拦截器里如何统一处理401错误但页面没跳转? 在项目里给Axios加了响应拦截器处理401,发现虽然能捕获到状态码,但跳转登录页的逻辑完全没执行。之前试过用window.location.replace('/login'),但页面还是卡在当前页没... UE丶卫利 前端 2026-01-27 09:37:53
假设你要测试的fetchData函数就是上面那样,测试可以这样写:
几个关键点:
1. 记得在测试文件顶部jest.mock('axios')
2. mockResolvedValue是用来模拟异步resolve的,比直接mockReturnValue更准确
3. 最后可以验证axios.get是否被正确调用
如果你要模拟错误情况,用mockRejectedValue:
这样写测试不会真的发请求,而且能覆盖各种返回情况。