NestJS + Jest で import を絶対パスで書いてテストを通す

NestJS JS/TS/Node

NestJSのキャッチアップ中に遭遇したエラーの解決方法をまとめました。

環境

Jestの設定は jest.config.js ではなく package.json で行っています。

バージョンは以下の通り。

"dependencies": {
  "@nestjs/common": "^10.0.0",
  "@nestjs/core": "^10.0.0",
  "@nestjs/platform-express": "^10.0.0"
},
"devDependencies": {
  "@nestjs/cli": "^10.0.0",
  "@nestjs/schematics": "^10.0.0",
  "@nestjs/testing": "^10.0.0",
  "@types/express": "^5.0.0",
  "@types/jest": "^29.5.2",
  "jest": "^29.5.0",
  "ts-jest": "^29.1.0",
},

エラー内容

NestJSのアプリでモジュールを絶対パスでimportしている箇所が $ npm run test のテスト実行時にエラーになってしまいます。

Cannot find module 'src/common/pipes/custom-parse-int/custom-parse-int.pipe' from 'practice/practice.controller.ts'

Require stack:
  practice/practice.controller.ts
  practice/practice.controller.spec.ts

  1 | import { Controller, Get, Param } from '@nestjs/common';
  2 | import { PracticeService } from './practice.service';
> 3 | import { CustomParsePipe } from 'src/common/pipes/custom-parse/custom-parse.pipe';

上記の例だと CustomParsePipe モジュールが見つけられないようです。
ちなみに '../common/pipes/custom-parse/custom-parse.pipe'; と相対パスにすると問題なくテストは通ります。

解決方法

次の章で解説するので先に結論を書きます。
package.json の jest の設定はデフォルトで以下になっています。

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

変更する箇所は以下の 2点だけです。

  • rootDir の値を "src" から "./" に変更
  • rootDir の下に "modulePaths": ["<rootDir>"], を追加

最終的にこのようになります。

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

解説

rootDir はJestがテストとモジュールを探索するルートディレクトリを指定します。
Jestの設定をjest.config.jsで行っている場合はjest.config.jsがあるディレクトリを、package.jsonで行っている場合はpackage.jsonがあるディレクトリを指定します。
公式ドキュメントで 多くの場合、リポジトリのどこにソースコードを格納するかによって、&nbsp;'src'&nbsp;または&nbsp;'lib'に設定されるでしょう。 と記載がありデフォルトで src が設定されたと思われます。

modulePaths はモジュールの依存関係の解決を行うロケーションの絶対パスを配列で指定します。
rootDir に設定した値は他のオプションで'<rootDir>' で参照可能になるので[“”]とすることで依存解決をルートディレクトリから行うことができるようになります。

参考資料

コメント

タイトルとURLをコピーしました