NestJS Jest 找不到具有绝对路径的模块

Posted

技术标签:

【中文标题】NestJS Jest 找不到具有绝对路径的模块【英文标题】:NestJS Jest cannot find module with absolute path 【发布时间】:2021-01-09 15:55:18 【问题描述】:

我有一个全新的 NestJS 应用程序。我正在尝试运行单元测试,但在使用绝对路径(“src/users/...”)时,由于“找不到模块..”,它们一直失败,但在使用相对路径(“./users/ ..”)。我这里的配置有什么问题吗?

package.json 中的 Jest 设置:

"jest": 
  "moduleFileExtensions": [
    "js",
    "json",
    "ts"
  ],
  "rootDir": "src",
  "testRegex": ".spec.ts$",
  "transform": 
    "^.+\\.(t|j)s$": "ts-jest"
  ,
  "coverageDirectory": "../coverage",
  "testEnvironment": "node"

tsconfig.json:


  "compilerOptions": 
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true
  

【问题讨论】:

你的问题和***.com/questions/63709973/…类似吗? 【参考方案1】:

我遇到了同样的问题,问题是 Nestjs 创建的默认 jest 配置。

我将"rootDir": "src" 更改为"rootDir": "./" 并添加"modulePaths": ['<rootDir>']

最后,我开玩笑的配置是这样的:

  moduleFileExtensions: ['js', 'json', 'ts'],
  rootDir: './',
  modulePaths: ['<rootDir>'],
  testRegex: 'spec.ts$',
  transform: 
    '^.+\\.(t|j)s$': 'ts-jest'
  ,
  coverageDirectory: './coverage',
  testEnvironment: 'node',

如果您的配置有一些相对路径,您可能需要更新它们,因为您的 rootDir 不再是 src

您甚至可以删除 rootDir,如果您在 package.json 中设置了 jest 配置,或者配置文件位于项目的根目录中,如文档中所述:https://jestjs.io/docs/en/configuration#rootdir-string

如果你想了解modulePaths:https://jestjs.io/docs/en/configuration#modulepaths-arraystring

希望它也对你有用。

【讨论】:

注意这个配置可以在package.json找到。 Nest 对 jest 的预配置大部分是相同的。对我来说,我只需要更改 rootDir 并添加 modulePaths 即可,如上图所示。 这对我有用 如果您有类似@shared 或类似@ 的内容,请检查moduleNameMapper 以使其解决。【参考方案2】:

我相信您在tsconfig.json 中缺少rootDir

如果你想import ... from 'src/...rootDir需要等于./

检查这个例子:


"moduleFileExtensions": [
    "ts",
    "tsx",
    "json",
    "js"
],
"rootDir": "./",
"testRegex": ".spec.ts$",
"collectCoverageFrom": ["**/*.ts", "!**/node_modules/**"],
"coverageDirectory": "./coverage",
"coverageReporters": ["html", "text", "text-summary"],
"preset": "ts-jest",



  "compilerOptions": 
  "module": "commonjs",
  "declaration": true,
  "removeComments": true,
  "emitDecoratorMetadata": true,
  "experimentalDecorators": true,
  "allowSyntheticDefaultImports": true,
  "target": "es2017",
  "sourceMap": true,
  "outDir": "./dist",
  "rootDir": "./",
  "baseUrl": "./",
  "incremental": true

【讨论】:

以上是关于NestJS Jest 找不到具有绝对路径的模块的主要内容,如果未能解决你的问题,请参考以下文章

在 CI 中使用 typescript 路径开玩笑“找不到模块”

找不到模块'@nestjs/typeorm'

NestJS - 找不到模块'html'

开玩笑找不到模块

Nestjs 错误:找不到模块“./app.controller”

Jest,ts-jest,带有 ES 模块导入的打字稿:找不到模块