Mock报错404主因是Mock.js未正确拦截请求,常见于路径不匹配、未启用拦截(如未调用Mock.setup())、或mock规则未注册;需检查URL正则、请求方法及Mock初始化时机。

记住 JS 中 Mock 模拟常见报错信息,关键不是死记硬背错误字符串,而是理解错误背后的 Mock 机制原理 + 常见断点位置。下面按高频场景分类整理,帮你快速定位、修复,自然就记住了。
Mock 函数没被调用?检查“谁在调用”和“谁被 Mock”
典型报错:Expected mock function to have been called 或断言失败但逻辑看似执行了。
- 确认你 Mock 的是 被依赖的模块/函数本身,而不是它的调用方(比如你该 Mock
axios.get,而不是在测试函数里写jest.mock('./api')却忘了实际调用它) - 检查模块导入方式:ESM(
import)需用jest.mock('xxx')在import之前;CommonJS(require)可动态 mock,但要注意加载时机 - 验证是否触发了真实调用路径——加个
console.log或 debugger 看执行流有没有走到被 mock 的函数内部
Mock 返回值不对?重点看“返回时机”和“返回层级”
典型现象:接口返回了 { data: { user: ... } },但测试里取到的是 undefined;或 Promise 一直 pending。
-
mockReturnValue是同步返回;mockResolvedValue才适用于async/await或.then()场景 - 注意对象结构嵌套:如果 API 封装层返回
response.data,那你 mock 的应该是整个response对象,而不是只 mockdata - 避免漏掉
mockClear()或mockReset()—— 上一个测试残留的返回值可能影响当前用例
Cannot read property 'xxx' of undefined?大概率是“模块未正确 mock 或未导出”
常见于 mock 第三方库(如 lodash、dayjs)或自定义 hook 时。
- 检查被 mock 模块的导出方式:默认导出(
export default xxx)要用mockReturnValue;命名导出(export const fn = ...)需用jest.mock('xxx', () => ({ fn: jest.fn() })) - ESM 环境下,
jest.mock是自动 hoist 的,但如果你用了require动态引入,mock 必须在require之前完成 - 用
console.log(require('xxx'))在测试中直接打印,确认 mock 后导出的内容是否符合预期
Test suite failed to run?留意“全局 mock 冲突”和“环境不匹配”
报错出现在测试启动阶段,不是单个用例失败。
- 多个
jest.mock嵌套或重复 mock 同一模块,尤其在setupFilesAfterEnv里全局配置时容易冲突 - Node 环境下 mock 浏览器 API(如
localStorage、fetch)会报错,需配testEnvironment: 'jsdom' - TS 项目中,若 mock 类型声明缺失,虽不影响运行,但编辑器报错干扰判断——补上
declare module 'xxx' { ... }或使用@ts-ignore临时跳过
把这几类错误和对应检查点列成小纸条贴在显示器边,跑三次测试、修两次错,比背十遍报错文本管用得多。核心就一条:Mock 不是“假装有”,而是“精准接管调用链中的那一环”。











