如何让Jest识别Monorepo中自定义的TypeScript路径?
我有一个包含Angular和NestJS应用的Monorepo,各应用共享接口、枚举等内容。业务代码和Angular应用的Jasmine测试都能正常运行,但NestJS应用的Jest测试无法导入Monorepo共享目录中的内容。
目录结构
my-repo/ ├── ng-ui-1/ ├── ng-ui-2/ ├── nest-api/ │ ├── src/ (业务代码目录) │ ├── tsconfig.json │ ├── tsconfig.build.json │ ├── (其他文件...) ├── monorepo-shared/ │ ├── enums/ │ │ ├── *.enum.ts 文件 │ ├── interfaces/ │ │ ├── *.interface.ts 文件
当前配置
所有TypeScript应用的tsconfig.json中已配置路径别名,运行正常:
{ "compilerOptions": { //... "paths": { "@monorepo-shared/constants": ["../monorepo-shared/constants/index"], "@monorepo-shared/enums": ["../monorepo-shared/enums/index"], "@monorepo-shared/interfaces":["../monorepo-shared/interfaces/index"] } } }
TS文件中导入共享内容的方式(除Jest测试外均正常):
import { BrandingTypeEnum } from '@monorepo-shared/enums';
错误信息
运行Jest测试时出现:
Cannot find module '@monorepo-shared/enums' from 'account/account.controller.spec.ts'
当前Jest配置(package.json中):
"jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "moduleDirectories": [ "node_modules", "@monorepo-shared/constants", "@monorepo-shared/enums", "@monorepo-shared/interfaces", ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" },
试过多种路径配置方案但无效,需要修改哪些配置让Jest识别tsconfig.json中定义的路径?
Jest无法直接识别TypeScript的paths配置,需通过moduleNameMapper映射别名到实际路径,或让ts-jest自动读取tsconfig的路径规则,同时清理无效配置项。
具体修改步骤
添加
moduleNameMapper映射别名
在package.json的Jest配置中新增moduleNameMapper,将@monorepo-shared/*别名对应到实际文件路径:"jest": { // ... 原有配置 "moduleNameMapper": { "^@monorepo-shared/constants$": "<rootDir>/../monorepo-shared/constants/index", "^@monorepo-shared/enums$": "<rootDir>/../monorepo-shared/enums/index", "^@monorepo-shared/interfaces$": "<rootDir>/../monorepo-shared/interfaces/index" }, // ... 原有配置 }注:
<rootDir>对应配置的rootDir: "src",路径需基于src目录向上回退到monorepo-shared。让ts-jest自动同步tsconfig路径(可选)
若不想手动维护moduleNameMapper与tsconfigpaths的同步,可配置ts-jest自动读取tsconfig:- 修改Jest的
transform配置:"jest": { // ... 原有配置 "transform": { "^.+\\.(t|j)s$": ["ts-jest", { "tsconfig": "tsconfig.json" }] }, // ... 原有配置 }
此配置下
ts-jest会自动解析tsconfig.json中的paths规则,无需手动编写moduleNameMapper。- 修改Jest的
清理无效的
moduleDirectories配置
之前添加的@monorepo-shared/xxx属于错误用法,moduleDirectories仅用于指定模块查找目录(如node_modules),需删除这些无效项:"moduleDirectories": [ "node_modules" ],
最终完整Jest配置示例
"jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "moduleDirectories": [ "node_modules" ], "moduleNameMapper": { "^@monorepo-shared/constants$": "<rootDir>/../monorepo-shared/constants/index", "^@monorepo-shared/enums$": "<rootDir>/../monorepo-shared/enums/index", "^@monorepo-shared/interfaces$": "<rootDir>/../monorepo-shared/interfaces/index" }, "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": ["ts-jest", { "tsconfig": "tsconfig.json" }] }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" },
内容的提问来源于stack exchange,提问作者Chris Barr

