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
相关产品推荐
相关产品推荐

