Jest 测试中如何模拟 axios 的异步请求? 慕容爱香 提问于 2026-03-04 23:04:18 阅读 55 前端 我在用 Jest 写单元测试,组件里用了 axios 发请求,但每次测试都真的发出去了,还报错。我想 mock 掉 axios,但不知道怎么正确模拟异步返回。 试过用 jest.mock('axios'),但数据没生效。比如我这个函数: const fetchData = async () => { const res = await axios.get('/api/data'); return res.data; } 该怎么写测试才能让它返回我想要的 mock 数据? 我来解答 赞 6 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 Designer°凌薇 Lv1 你这个问题简单,直接用 jest.mock 把 axios 换成假的就行。记得在测试里设置返回值。 jest.mock('axios', () => ({ get: jest.fn().mockResolvedValue({ data: { key: 'mock value' } }) })); test('fetchData returns mocked data', async () => { const result = await fetchData(); expect(result).toEqual({ key: 'mock value' }); }); 这代码直接拿去用,别想太多。记得 import 的时候 axios 要用默认导出的 mock 版本。老老实实写单元测试吧,别偷懒。 回复 点赞 2026-03-30 21:09 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')); 这样写测试不会真的发请求,而且能覆盖各种返回情况。 回复 点赞 4 2026-03-05 06:01 加载更多 相关推荐 1 回答 29 浏览 单元测试里怎么 mock 一个 axios 请求? 我在写 Jest 单元测试时,组件里用了 axios.get 请求数据,但每次跑测试都会真的发请求,特别慢还容易失败。试过用 jest.mock('axios'),但不知道怎么模拟返回值。 有没有人能... 设计师春芹 前端 2026-03-03 15:43:20 1 回答 42 浏览 Jest 测试中如何正确模拟 React 组件的异步 useEffect? 我在用 Jest + React Testing Library 测试一个组件,它在 useEffect 里发起了异步请求。测试总是报“无法在未挂载的组件上执行 setState”,我试过用 awai... 令狐倩利 框架 2026-03-05 14:04:22 2 回答 61 浏览 Jest 测试移动端 React 组件时如何模拟 useMediaQuery? 我写了个响应式组件,用 useMediaQuery 判断是不是移动端,但在 Jest 里跑测试一直报错说 matchMedia 未定义。试过 mock window.matchMedia,但还是不生效... 若彤 移动 2026-03-26 04:09:25 2 回答 60 浏览 Jest 测试移动端组件时怎么模拟触摸事件? 我用 Jest + React Testing Library 写测试,但有个组件依赖 onTouchStart 事件,本地跑测试一直不触发。试过 fireEvent.touchStart,但报错说方... Air-利云 移动 2026-03-18 05:55:18 2 回答 75 浏览 Jest测试时mock函数调用次数始终为0怎么办? 在测试React组件时遇到了奇怪的问题。我用jest.fn()模拟了一个handleClick函数,但测试时expect(mockFn.mock.calls.length).toBe(1)一直报错说实... UX-云碧 框架 2026-02-12 23:04:28 2 回答 81 浏览 为什么我的axios请求拦截器设置的headers没生效? 在用axios写请求拦截器时,明明在config.headers里加了token,但抓包发现请求头里始终没有这个字段,这是怎么回事? 我的代码是这样的: axios.interceptors.requ... UI巧云 前端 2026-02-16 21:47:24 2 回答 87 浏览 Postman Interceptor无法拦截Vue项目的Axios请求,是什么原因? 我在开发Vue项目时用Postman Interceptor想抓取Axios请求,但发现所有请求都没被拦截到。已经按官方说明安装了chrome插件并配置了证书,测试请求也能成功拦截,但项目里的真实请求... 西门培静 工具 2026-02-14 06:55:24 2 回答 44 浏览 axios请求拦截后请求头没变化是怎么回事? 在用axios设置请求拦截时,给config.headers赋值token后,发现发送出去的请求头里并没有这个字段,控制台也没报错,这是为什么呢? 我按照文档写了拦截器: axios.intercep... 迷人的书娟 前端 2026-02-09 16:24:32 2 回答 111 浏览 为什么Axios请求拦截器没触发?请求头没添加进去 我给Axios设置了请求拦截器,想统一加token,但发现请求头里根本没有Authorization字段。我直接在拦截器里打log也看不到输出,这是怎么回事? 代码是这样写的: axios.inter... 玉萱 ☘︎ 前端 2026-02-04 06:18:27 2 回答 75 浏览 为什么Axios请求成功但响应数据为空? 我在Vue组件里用Axios请求接口,返回状态是200,但response.data一直是空对象... 代码是这样的: <template> <div>{{ items }}&... 慕容妍妍 前端 2026-02-02 15:39:31
这代码直接拿去用,别想太多。记得 import 的时候 axios 要用默认导出的 mock 版本。老老实实写单元测试吧,别偷懒。
假设你要测试的fetchData函数就是上面那样,测试可以这样写:
几个关键点:
1. 记得在测试文件顶部jest.mock('axios')
2. mockResolvedValue是用来模拟异步resolve的,比直接mockReturnValue更准确
3. 最后可以验证axios.get是否被正确调用
如果你要模拟错误情况,用mockRejectedValue:
这样写测试不会真的发请求,而且能覆盖各种返回情况。