Jest中Mock Axios时自定义对象为何导致axios实例undefined?
Jest Mock Axios两种写法的差异解析
两种写法的核心区别
1. 自动Mock(jest.mock('axios'))
当你只调用jest.mock('axios')时,Jest会自动生成一个和原axios模块结构完全一致的Mock对象:
- 保留原模块的所有导出成员(包括默认导出的axios实例、
Axios构造函数、create方法等) - 每个成员都会被替换成空的
jest.fn() - 之后你通过
axios.post = jest.fn(...)赋值,本质是给这个自动生成的Mock实例的post方法重新定义实现,所以能正常匹配被测代码里的调用。
对应的工作代码:
jest.mock('axios'); axios.post = jest.fn().mockImplementation(() => Promise.resolve({ data: {} }));
2. 手动Mock(带工厂函数的写法)
你之前的手动Mock写法错误在于没有正确对应axios模块的导出结构:
- axios模块的默认导出是一个包含
post、get等方法的实例对象 - 你直接返回
{ post: jest.fn(...) },Jest会把这个对象当成模块的命名导出集合,而默认导出的部分会是undefined - 当被测代码里用
import axios from 'axios'(默认导入)调用axios.post时,自然会报“Cannot read properties of undefined (reading 'post')”
修正后的手动Mock写法
需要把Mock的实例对象放到default字段中,对应模块的默认导出:
jest.mock('axios', () => { return { default: { post: jest.fn(() => Promise.resolve({ data: {} })) } }; });
如果你的代码还用到了axios的其他导出(比如axios.create),需要在返回的对象里一并定义,否则这些导出会是undefined。
内容的提问来源于stack exchange,提问作者sergey muhlinin
相关产品推荐
相关产品推荐

