NestJSにswc/jestを導入してテストを早くする


swcを使う

こちらのスクラップ参考にしました。

https://zenn.dev/odan/scraps/ab5d046019d760

@swc/coreと@swc/jest をインストールします。

.swcrcファイルをレポジトリのルートに作成し、以下を書きます。

.swcrc
{
  "jsc": {
    "parser": {
      "syntax": "typescript",
      "tsx": false,
      "decorators": true,
      "dynamicImport": false
    },
    // ターゲットは好きなやつを。ただドキュメントには
    // Disable es3 / es5 / es2015 transforms と書いてあるので
    // es2015以下は利用できない???
    "target": "es2020",
    "keepClassNames": true,
    "transform": {
      "legacyDecorator": true,
      "decoratorMetadata": true
    },
    // パスエイリアスを利用しているなら以下2項目を編集する。利用してなければ削除。
    // "baseUrl": "./",
    // "paths": {
    //   "@/*": ["./src/*"] 
    // }
  },
  "module": {
    "type": "commonjs",
    "noInterop": false
  },
  "sourceMaps": true,
}

jest.config.jsを書き換えます。

jest.config.js
const config = {
  moduleFileExtensions: ['js', 'json', 'ts'],
  rootDir: './',
  modulePaths: ['<rootDir>'],
  testRegex: (/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$,
  // グローバルセットアップとティアダウンがあれば以下を編集する。
  // globalTeardown: '<rootDir>/src/share/teardownJest.ts',
  // globalSetup: '<rootDir>/src/share/setupJest.ts',
  transform: {
    '^.+\\.(t|j)s$': ['@swc/jest'],
    // デフォルトだとts-jest使っている。
    // '^.+\\.(t|j)s$': 'ts-jest',
  },
  collectCoverageFrom: ['src/**/*.(t|j)s', '!src/**/*.d.ts'],
  coverageDirectory: './coverage',
  testEnvironment: 'node',
  // path alias の設定。tsconfigに設定してあるがjest runner上ではそちらは有効にならない。もしパスエイリアスを利用しているならここにも書く。
  // moduleNameMapper: {
  //  '^@/(.*)$': '<rootDir>/src/$1',
  //},
};

module.exports = config;

注意点

  • parserの内容は、TypeScriptなのかJavaScriptなのかNodeJSなのかReactなのかでかなり変わってくるので注意してください。
  • パスエイリアスを利用している場合は、baseUrlpathsを記入する。利用していなければこれは書かなくて良い。
  • sourceMapsを書かないとjestのカバレッジが動かなかった。
  • targetは状況に応じて変える。
  • .swcrcは自動で読まれる。