Mock返回值未生效的核心是运行时引用与被Mock对象不一致,需确保jest.mock()在所有import前、导出方式匹配、避免模块缓存,并验证是否真正调用到Mock函数。

Mock 模拟在 JS 开发中看似简单,实际一上手就容易卡在“数据没出来”“函数没调用”“返回值还是原始的”这类问题上。核心不是语法写错了,而是 Mock 没真正作用到运行时被调用的那个实例上。
模块加载时机错位:import 写太早,mock 就白配
ES 模块静态解析,一旦 import 完成,函数引用就被缓存了。如果你先 import 了被测模块或工具函数,再 jest.mock(),那 mock 根本覆盖不了已加载的原始代码。
- 把 jest.mock() 放在所有 import 语句之前(包括被测模块和 utils)
- 不确定是否生效?加一行 console.log(require('./utils').fn),看输出是不是
[MockFunction] - 对已加载模块要重试 mock,用 jest.resetModules() + jest.doMock() + require() 三连
导出方式不匹配:default 和命名导出混着用就失效
Mock 返回值不生效,十次有七次是因为你 mock 的导出形式,和业务代码 import 的方式对不上。
Node.js 可靠编程技能。避免事件循环阻塞、异步陷阱、ESM 兼容问题和内存泄漏。触发词:Node.js 开发、async/await、流处理、性能优化、安全编码。
- 原模块是 export default function foo() → mock 时必须返回
{ __esModule: true, default: jest.fn() } - 如果 mock 成
{ foo: jest.fn() },但调用方写的是 import foo from './module',那 foo 拿到的就是 undefined - 更稳妥的做法:用 jest.requireActual('./module') 拿真实导出,再只覆写需要 mock 的方法
调用路径没走通:mock 了 A,实际调用的是 B 内部的 C
常见于分层调用场景——你 mock 了 api.js 的 fetchData,但 service.js 在导入时直接解构赋值并缓存了该函数,后续调用走的是本地变量引用,根本没经过 api.js 的导出对象。
- 检查被测文件里是否用了 const { fetchData } = require('./api') 或类似静态解构
- 验证是否真调到了 mock 函数:加 expect(mockFn).toBeCalled(),不通过说明压根没进 mock 分支
- 必要时,在测试前手动清理:避免 jest.clearAllMocks() 或 jest.restoreAllMocks() 清掉你刚设好的实现
代理层 Mock 响应不生效:规则没命中或 HTTPS 拦截失败
用 Fiddler/Charles/Vite proxy 做接口层 mock,常遇到“改了规则但页面还是请求真实后端”的情况。
- 确认代理工具已启用 HTTPS 解密(尤其现代浏览器默认拦截非信任证书)
- 规则匹配要精确:主机名、路径、查询参数缺一不可,比如
oSession.HostnameIs("api.example.com") && oSession.PathAndQuery.Contains("/user/list") - Vite 中配置 proxy,确保 target 是真实域名,且 rewrite 规则能正确替换路径;开发环境启用了 proxy,但 build 后不会生效,记得区分 NODE_ENV










