簡體   English   中英

Jest + nest.js,測試的絕對路徑

[英]Jest + nest.js, absolute paths for tests

這是我在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": "./",
  }
}

我使用 ts-jest 模塊在我的 Typescript 項目中使用 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

開玩笑的配置文件

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
});

我對絕對路徑有同樣的問題。 而不是使用:

  • "src/auth/auth.service"

我不得不使用

  • "../auth/auth.service"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM