单元测试里怎么 mock 一个 axios 请求?
我在写 Jest 单元测试时,组件里用了 axios.get 请求数据,但每次跑测试都会真的发请求,特别慢还容易失败。试过用 jest.mock('axios'),但不知道怎么模拟返回值。
有没有人能给个简单的例子?比如我想让这个请求返回 { data: { id: 1 } },该怎么写?
import axios from 'axios';
import { fetchData } from './api';
test('fetchData returns correct data', async () => {
// 这里该怎么 mock axios?
const result = await fetchData();
expect(result.id).toBe(1);
});
你需要在文件顶部先 mock 掉整个 axios 模块,然后在测试用例里把 get 方法给劫持了,让它返回你想要的数据。
下面是改好的代码,直接拿去用:
这里有个坑要注意,mockResolvedValue 是模拟异步成功返回,如果你的业务代码里取的是 res.data,那你 mock 的时候结构得对上。如果直接 return 整个 response,那就把 data 去掉。写单测最烦的就是这层结构对不齐,debug 半天发现是数据包了一层,吐血。
写完记得跑一下,别光看。