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

Jest中使用变量传模块路径给jest.mock()不生效是什么原因?

问题根因

核心是你不了解Jest对jest.mock的**编译期提升(hoist)**规则,两种写法的执行时机存在本质差异:

  • Jest在运行测试代码前,会先对测试文件做静态编译处理,提前把所有jest.mock调用提升到整个模块的最顶部执行,这个阶段只会解析字面量参数,不会处理变量赋值、表达式计算等运行时逻辑。
  • 直接传入硬编码路径时,编译阶段就能直接读取到完整的路径字符串,mock可以正常生效。
  • 将路径赋值给变量再传入时,编译阶段处理jest.mock(path)的调用时,const path = xxx的赋值逻辑还没执行,Jest无法拿到有效路径值,mock自然失效。
解决方案

如果必须使用动态路径做mock,可以用不会被编译提升的jest.doMock方法,它是运行时执行的,支持传入变量作为路径:

const path = './../../components/Spinner'
jest.doMock(path)
// 注意:要在doMock执行之后再导入目标模块,之前导入的模块不会被mock影响
const Spinner = require('./../../components/Spinner')

内容的提问来源于stack exchange,提问作者Pablo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:36:05