Mock失败主因是运行时函数与mock函数非同一引用;需检查console.log是否显示[MockFunction]、jest.mock()位置、ESM下用doMock、resetModules重置缓存;404重点核对mock路径匹配、vite配置及规则前缀;GIF异常因MockJS宽泛拦截,应排除静态资源路径;未mock方法返回undefined可启用errorOnUnexpectedMockCall或fallbackMockImplementation主动报错。

Mock 模拟在 JS 中报错,多数不是语法写错了,而是“没 mock 到真正被调用的那个东西”。核心就一条:运行时实际执行的函数,和你 mock 的函数,是不是同一个引用。抓住这点,90% 的问题能快速定位。
Mock 返回值不生效?先确认是否命中了真实调用链
常见表现是:写了 mockImplementation,但断言 toBeCalled() 失败,或返回值还是原始逻辑的结果。
- 在测试里加一句
console.log(被调用的函数),看输出是不是[MockFunction];如果不是,说明 mock 根本没覆盖到 - 检查 import 顺序:
jest.mock()必须放在所有import语句之前(包括被测模块),否则模块已被缓存,mock 失效 - 如果是 ESM 项目,考虑改用
jest.doMock()+require()动态加载,绕过静态导入缓存 - 被测模块若内部直接引用了第三方模块的函数(比如
utils.fetch),而你只 mock 了utils的导出对象,可能因内部引用未被拦截——此时需配合jest.resetModules()重置模块缓存再重新 require
404 报错?重点查 Mock 规则与请求路径是否匹配
尤其在 Vue/React + Axios + MockJS 场景下,Request failed with status code 404 很常见,但 URL 明明写对了。
- 打开浏览器 Network 面板,看请求是否真的发出去了;如果没发,说明请求被拦截前就失败了(比如 baseURL 拼错、axios 实例未正确使用)
- 如果请求出现在面板里且状态码是 404,说明 MockJS 或 vite-plugin-mock 没注册对应规则:检查 mock 路径是否带前缀(如
/api/listvslist)、HTTP 方法是否一致(get写成GET会不匹配) - Vite 项目中确认
vite.config.ts已正确配置viteMockServe,且mockPath指向真实存在的文件夹(如"./mock"),并重启开发服务器 - 确保 mock 文件被正确
require或import(例如在mock/index.js中显式引入各模块)
GIF/图片不显示或卡顿?警惕 MockJS 误拦截二进制资源
现象是动图静止、Canvas 报解码错误、Network 中 GIF 请求返回 JSON 字符串而非 image/gif。
- MockJS 默认替换全局
XMLHttpRequest,只要 URL 匹配规则,不管是不是数据接口,都会拦截并返回 mock 数据 - 检查 mock 规则正则是否过于宽泛(如
/\/.*/或/api/却漏写了路径分隔符,导致/assets/loading.gif也被捕获) - 解决方案:在 mock 规则中排除静态资源路径,例如用
!/^\/(assets|public|img|favicon)/.test(url)做白名单过滤 - 更稳妥做法:只 mock 明确的 API 路径,避免通配;或改用更可控的方案(如 MSW)替代全局 XHR 拦截
未模拟方法返回 undefined?主动让问题暴露出来
调用一个没 mock 的方法却得到 undefined,可能引发深层逻辑崩溃,但错误堆栈难定位。
- 不要依赖手动为每个方法写
throw new Error,太繁琐 - 用
jest-mock-extended的fallbackMockImplementation统一设置:所有未定义实现的方法,直接抛错 - 或在 Jest 配置中启用
errorOnUnexpectedMockCall: true(Jest 29+),让未 mock 的调用立刻中断 - TypeScript 项目中还可结合类型守卫,在 mock 对象创建时强制校验所有方法是否已赋值


















