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

如何让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的路径规则,同时清理无效配置项。

具体修改步骤

  1. 添加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。

  2. 让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。

  3. 清理无效的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:04:52