使用Jest Mock带拦截器的axios时报mockImplementation未定义
解决方案
问题根因
两个报错分别对应两次mock配置的缺失项:
- 第一次手动mock只实现了
create方法和拦截器结构,没有补充get/post等HTTP请求方法的mock,所以调用axios.get.mockImplementation时会因为axios.get为undefined抛出错误。 - 第二次用
jest.mock('axios')自动mock,axios.create返回的默认是空对象,缺少初始化逻辑需要的interceptors属性,所以在注册拦截器阶段就报错。
正确Mock配置
你需要在mock中同时覆盖拦截器结构和所有常用HTTP请求方法,同时兼容直接调用axios方法、调用create生成实例发请求两种场景:
jest.mock('axios', () => { // 创建统一的mock实例,同时包含拦截器和请求方法 const mockAxiosInstance = { interceptors: { request: { eject: jest.fn(), use: jest.fn() }, response: { eject: jest.fn(), use: jest.fn() }, }, get: jest.fn(), post: jest.fn(), put: jest.fn(), delete: jest.fn(), // 有其他请求方法需求可按相同格式补充 }; return { create: jest.fn(() => mockAxiosInstance), // 顶层axios方法指向实例的mock函数,保证两种调用方式共用同一份mock get: mockAxiosInstance.get, post: mockAxiosInstance.post, put: mockAxiosInstance.put, delete: mockAxiosInstance.delete, }; });
后续使用说明
配置完成后原测试代码中的axios.get.mockImplementation逻辑可以正常运行,无需其他修改。如果需要对post等其他方法做mock,也可以用相同的方式配置。
内容的提问来源于stack exchange,提问作者sineverba
相关产品推荐
相关产品推荐

