Jestjs 找不到Nestjs测试模块

Jestjs 找不到Nestjs测试模块,jestjs,nestjs,Jestjs,Nestjs,我使用Mongdoose和Nestjs创建了一个简单的RESTAPI。我总共做了两次测试,结果都失败了。 测试输出: src/app/auth/auth.service.spec.ts失败 ● 测试套件无法运行 Cannot find module '@shared/errors' from 'user.service.ts' 1 | import { BadRequestException, Injectable } from '@nestjs/common'; 2 | import

我使用Mongdoose和Nestjs创建了一个简单的RESTAPI。我总共做了两次测试,结果都失败了。 测试输出:

src/app/auth/auth.service.spec.ts失败 ● 测试套件无法运行

Cannot find module '@shared/errors' from 'user.service.ts'

  1 | import { BadRequestException, Injectable } from '@nestjs/common';
  2 | import { InjectModel } from '@nestjs/mongoose';
> 3 | import { Errors } from '@shared/errors';
    | ^
  4 | import { createMultipleRandom } from '@shared/utils';
  5 | import { Model } from 'mongoose';
  6 | import { AppLogger } from '../logger/logger';

  at Resolver.resolveModule (../../node_modules/jest-resolve/build/index.js:259:17)
  at Object.<anonymous> (user/user.service.ts:3:1)
auth.service.spec.ts:

从'@nestjs/testing'导入{Test,TestingModule};
从“/auth.service”导入{AuthService};
描述('AuthService',()=>{
let服务:AuthService;
beforeach(异步()=>{
常量模块:TestingModule=等待测试。createTestingModule({
提供者:[授权服务],
}).compile();
service=module.get(AuthService);
});
它('应该定义',()=>{
expect(service.toBeDefined();
});
});

在@shared/errors.ts中,我只导出一个常量变量。由于它不是一个模块,我应该如何在测试中导入它?如何解决此问题?

在使用typescript的路径映射时,还需要使用映射的路径更新jest配置。您的jest配置需要添加以下内容:

{
...
“moduleNameMapper”:{
“^@Shared/(.)*$”:“/src/app/Shared/$1”
}
}

假设您的
设置为
,而不是
/src
。您可以。

这里是解决jest路径问题的详细配置

moduleNameMapper中定义的键将替换为它们的值

例如,当jest看到“@resources”时,它会将其替换为“src/resources”

(使用索引文件帮助很大)

package.json中的Jest配置

 "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "moduleNameMapper": {
      "@resources": "<rootDir>/resources",
      "@shared": "<rootDir>/shared",
      "@email": "<rootDir>/email",
      "@auth": "<rootDir>/auth",
      "@config": "<rootDir>/config",
      "@database": "<rootDir>/database"
    },
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }


谢谢,这对我很有用:)我现在正在尝试测试使用Mongoose模型的服务,你对此也有一些建议吗?我想这会对我有帮助。你需要一个模拟模型来管理它。你可以像示例中那样模拟模型,但我现在有另一个问题。它说,“数据库连接”在MongooseModule上下文中不可用。既然我做了mock,为什么我需要一个连接呢?这会让我相信在代码的某个地方仍然有一个数据库连接在使用。如果不知道发生了什么,就很难回答。听起来像是一些模型,它被完全嘲笑了,但再一次,不能肯定我发现了问题。在“AuthService”中,我注入了“UserService”,它使用MongooseModule.forFeature(…)。所以MongooseModule在测试文件中丢失了。在我导入MondoosModule.forRoot(..)模块后,它工作了。再次感谢。
{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "paths": {
      "@app/*": ["src/app/*"],
      "@auth/*": ["src/app/auth/*"],
      "@config/*": ["config/*"],
      "@logger/*": ["src/app/logger/*"],
      "@shared/*": ["src/app/shared/*"],
      "@user/*": ["src/app/user/*"],
    }
  },
  "include": [
    "src/**/*"
  ],

  "exclude": ["node_modules", "dist"]
}
 "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "moduleNameMapper": {
      "@resources": "<rootDir>/resources",
      "@shared": "<rootDir>/shared",
      "@email": "<rootDir>/email",
      "@auth": "<rootDir>/auth",
      "@config": "<rootDir>/config",
      "@database": "<rootDir>/database"
    },
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }

 "paths": {
      "@resources/*": ["src/resources/*"],
      "@resources": ["src/resources"],
      "@shared/*": ["src/shared/*"],
      "@shared": ["src/shared"],
      "@email/*": ["src/email/*"],
      "@email": ["src/email"]
    }