You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:38:19