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

Rush Monorepo中Jest预设的jest.doMock模块解析路径问题

解决Jest预设中jest.doMock从错误目录解析内部模块的问题

核心问题分析

你的问题在于Jest预设包中的setupFiles脚本运行时,模块解析的基准目录是预设包本身的目录,而非使用该预设的子包目录。同时由于循环依赖限制,无法将内部包添加为预设包的依赖。

解决方案:动态从子包目录解析内部模块

通过require.resolve(或ES模块的动态import结合require.resolve)指定解析路径为子包的工作目录,让Jest从使用预设的子包目录而非预设包目录查找内部模块。

方案代码实现

若使用CommonJS格式的setup文件:

// 从当前测试执行的子包目录解析internalPackageA
const { mockedFuncA } = require(require.resolve('<internalPackageA>', { paths: [process.cwd()] }));

// 同样从子包目录解析要Mock的internalPackage
const targetPackagePath = require.resolve('<internalPackage>', { paths: [process.cwd()] });

jest.doMock(targetPackagePath, () => ({
  funcA: mockedFuncA
}));

若使用ES模块格式的setup文件(需支持顶层await):

// 动态解析并导入internalPackageA
const packageAPath = require.resolve('<internalPackageA>', { paths: [process.cwd()] });
const { mockedFuncA } = await import(packageAPath);

// 解析目标包路径
const targetPackagePath = require.resolve('<internalPackage>', { paths: [process.cwd()] });

jest.doMock(targetPackagePath, () => ({
  funcA: mockedFuncA
}));

原理说明

  • require.resolve的paths参数指定了模块解析的起始目录,这里用process.cwd()获取当前运行Jest的子包目录(即使用预设的子包根目录)。
  • 这种方式不需要将内部包添加到预设包的依赖中,完全避免了循环依赖问题。
  • 所有使用该预设的子包无需额外配置,直接复用预设中的Mock逻辑。

额外注意事项

  • 确保子包中已通过Rush正确链接了内部包,否则require.resolve无法找到对应的模块。
  • 若使用ES模块,需确保Jest配置中启用了顶层await(可通过升级Jest版本或调整testEnvironmentOptions实现)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:42:36