【问题标题】:Jest + nest.js, absolute paths for testsJest + nest.js,测试的绝对路径
【发布时间】:2021-09-08 16:11:44
【问题描述】:

这是我在package.json 中的jest 配置:

"jest": {
  "moduleFileExtensions": [
    "js",
    "json",
    "ts"
  ],
  "moduleDirectories":["node_modules", "src"], // tried to solve the issue like that
  "rootDir": "src",
  "testRegex": ".spec.ts$",
  "transform": {
    "^.+\\.(t|j)s$": "ts-jest"
  },
  "coverageDirectory": "../coverage",
  "testEnvironment": "node"
}

AFAIK Nest 没有添加 jest.config 文件,所以 package.json 是我最好的选择。

但是在这样做之后,我的代码仍然失败:

yarn run v1.22.5
$ jest
 FAIL  src/auth/auth.service.spec.ts
  ● Test suite failed to run

    Cannot find module 'src/auth/auth.service' from 'auth/auth.service.spec.ts'

      3 | import * as moment from 'moment';
      4 | import { RedisService } from '@custom/redis-client'; // this is in node_modules
    > 5 | import { AuthService } from 'src/auth/auth.service';
        | ^
      6 | import { ConfigService } from 'src/config/config.service';
      7 |
      8 | describe('AuthService', () => {

      at Resolver.resolveModule (../node_modules/jest-resolve/build/index.js:306:11)
      at Object.<anonymous> (auth/auth.service.spec.ts:5:1)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        3.486 s
Ran all test suites.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

我还尝试将其添加到 jest 配置以及 tsconfig:

"moduleNameMapper": {
  "src/(.*)": "<rootDir>/$1",
  "tests/(.*)": "<rootDir>/__tests__/$1"
},

但是有了这段代码,我得到了:

yarn run v1.22.5
$ jest
 FAIL  src/auth/auth.service.spec.ts
  ● Test suite failed to run

    Configuration error:
    
    Could not locate module ./src/redis/redis.health.indicator mapped as:
    /home/aironside/Documents/sygnum/dev-environment/api-layer/src/$1.
    
    Please check your configuration for these entries:
    {
      "moduleNameMapper": {
        "/src\/(.*)/": "/home/aironside/Documents/sygnum/dev-environment/api-layer/src/$1"
      },
      "resolver": undefined
    }

      at createNoMappedModuleFoundError (../node_modules/jest-resolve/build/index.js:551:17)
      at Object.<anonymous> (../node_modules/@sygnum/redis-client/index.ts:1:1)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        3.183 s
Ran all test suites.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

我错过了什么?

我的完整 tsconfig:

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

【问题讨论】:

    标签: javascript typescript jestjs nestjs


    【解决方案1】:

    我遇到了同样的问题。 请将"rootDir": "src" 更改为"rootDir": "./" 并在您的pakage.json 中添加"modulePaths": ["&lt;rootDir&gt;"].

    最后你的jest 对象应该是这样的:

    "jest": {
        "moduleFileExtensions": [
            "js",
            "json",
            "ts"
        ],
        "moduleDirectories": [
            "node_modules",
            "src"
        ],
        "rootDir": "./", // ***** CHANGE "rootDir": "src" to "rootDir": "./"
        "modulePaths": ["<rootDir>"], // ***** ADD "modulePaths": ['<rootDir>'], 
        "testRegex": ".spec.ts$",
        "transform": {
            "^.+\\.(t|j)s$": "ts-jest"
        },
        "coverageDirectory": "../coverage",
        "testEnvironment": "node"
    }
    

    这对我来说很好。希望你也是!!

    【讨论】:

      【解决方案2】:

      我在我的 Typescript 项目中使用 ts-jest 模块来处理 Jest。我使用 Jest 进行单元测试和 E2E 测试(目前),因此我对每个都有不同的配置文件,并使用一个通用的基本模块来不重复设置。

      我的测试在导入文件时不需要指定 src/ ,只需指定其下的正常路径即可。此外,此配置具有支持在源代码中使用 Typescript 路径(@LIBRARY、@MODULE 等)的插件。

      jest-base.config.js

      const tsconfig = require('./tsconfig.json');
      const moduleNameMapper = require('tsconfig-paths-jest')(tsconfig);
      
      module.exports = {
          moduleNameMapper,
          preset: 'ts-jest',
          testEnvironment: 'node',
      
          rootDir: './',
      
          collectCoverage: true,
          collectCoverageFrom: [
              '<rootDir>/**/*.ts',
              '!<rootDir>/**/*.interface.ts',
              '!<rootDir>/**/*.mock.ts',
              '!<rootDir>/**/*.module.ts',
              '!<rootDir>/**/__mock__/*',
              '!<rootDir>/src/main.ts'
          ],
          coverageProvider: 'v8',
          coverageReporters: [
              'clover',
              'json',
              'lcov',
              'text',
              'text-summary'
          ],
          resetModules: true,
          setupFiles: [
              'dotenv/config'
          ],
          // Add the community jest-extended matchers
          setupFilesAfterEnv: [
              'jest-extended'
          ],
          verbose: false
      };
      

      然后对于单元测试,我使用以下 jest.config.js,带有 package.json 脚本选项jest --watchAll --config ./jest.config.js

      jest.config.js

      const JestBaseConfiguration = require('./jest-base.config');
      
      module.exports = Object.assign(JestBaseConfiguration, {
      
          // A list of paths to directories that Jest should use to search for files in
          roots: [
              '<rootDir>/src',
          ],
      
          coverageDirectory: '<rootDir>/docs/coverage',
          coverageThreshold: {
              global: {
                  branches: 80,
                  functions: 50,
                  lines: 50,
                  statements: 50
              }
          },
          testTimeout: 30000    // Set in each config in case different values are needed
      });
      

      对于端到端测试,我使用以下 jest-e2e.config.js,带有 package.json 脚本选项 jest --watchAll --config ./jest-e2e.config.js

      jest-e2e.config.js

      const JestBaseConfiguration = require('./jest-base.config');
      
      module.exports = Object.assign(JestBaseConfiguration, {
          moduleFileExtensions: ['js', 'json', 'ts'],
          testRegex: '.e2e-spec.ts$',
          transform: {
              '^.+\\.(t|j)s$': 'ts-jest'
          },
      
          // A list of paths to directories that Jest should use to search for files in
          roots: [
              '<rootDir>/test'
          ],
      
          coverageDirectory: '<rootDir>/docs/e2e-coverage',
          coverageThreshold: {
              global: {
                  branches: 5,
                  functions: 5,
                  lines: 5,
                  statements: 5
              }
          },
          testTimeout: 30000    // Set in each file in case different values are needed
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 2021-01-09
        • 2014-10-14
        相关资源
        最近更新 更多