Jest运行时找不到构建生成的dist/versioninfo模块,jest.mock无效如何解决?
Cannot find module 'dist/versioninfo' from '../src/app.controller.ts'
这个问题的核心有两点:
- 你此前使用的
jest.mock用法错误,第二个入参需要返回模块的导出对象,而非源码字符串 - Jest默认的模块搜索路径未包含项目根目录,即使dist目录下存在对应文件也无法被识别
解决方案
方案1:修正mock写法(快速适配单测试文件)
将现有mock代码替换为如下写法,放在测试文件最顶部,所有导入逻辑之前:
jest.mock('dist/versioninfo', () => ({ VERSAO: "0.0.1 (dev)", DESCRICAO: "" }))
如果修改后仍报模块不存在,在jest.config.js中添加根目录到模块搜索路径:
module.exports = { // 保留原有配置,新增如下字段 moduleDirectories: ['node_modules', '<rootDir>'] }
方案2:全局模块映射(多测试文件共用,无需重复写mock)
- 在项目根目录新建
__mocks__/versioninfo.ts,写入测试用的导出内容:
export const VERSAO = "0.0.1 (dev)"; export const DESCRICAO = "";
- 在
jest.config.js中添加模块映射规则:
module.exports = { // 保留原有配置,新增如下字段 moduleNameMapper: { '^dist/versioninfo$': '<rootDir>/__mocks__/versioninfo.ts' } }
配置完成后,所有测试文件导入dist/versioninfo时会自动加载mock内容,无需单独声明。
方案3:预生成构建文件(和生产运行逻辑保持一致)
如果需要测试场景和生产构建的逻辑完全对齐,可以配置Jest全局前置钩子,在测试启动前自动生成versioninfo文件:
- 新建
jest-global-setup.js文件,写入生成逻辑:
const fs = require('fs'); const path = require('path'); module.exports = async () => { const distPath = path.resolve(__dirname, 'dist'); if (!fs.existsSync(distPath)) fs.mkdirSync(distPath); const fileContent = ` export const VERSAO = "0.0.1 (dev)"; export const DESCRICAO = ""; `.trim(); fs.writeFileSync(path.resolve(distPath, 'versioninfo.ts'), fileContent); }
- 在
jest.config.js中注册钩子:
module.exports = { // 保留原有配置,新增如下字段 globalSetup: '<rootDir>/jest-global-setup.js' }
内容的提问来源于stack exchange,提问作者Pedro Papadópolis
相关产品推荐
相关产品推荐

