[NestJS + Jest] ユニットテスト時に絶対パスでimportエラー: Cannot find module

2023/01/22に公開

概要

エラーを解消してユニットテストをしたい

環境

package.json
  "dependencies": {
    "@nestjs/common": "^9.0.0",
    "@nestjs/config": "^2.2.0",
    "@nestjs/core": "^9.0.0",
    "@nestjs/platform-express": "^9.0.0",
  },
  "devDependencies": {
    "@nestjs/cli": "^9.0.0",
    "@nestjs/schematics": "^9.0.0",
    "@nestjs/testing": "^9.0.0",
    "@types/express": "^4.17.13",
    "@types/jest": "29.2.4",
    "jest": "29.3.1",
    "ts-jest": "29.0.3",
  },

エラー内容

yarn test すると、Cannot find module エラーがでて先に進まない

FAIL  src/tasks/tasks.service.spec.ts
  ● Test suite failed to run

    Cannot find module 'src/users/users.service' from 'tasks/tasks.service.ts'

相対パスでインポートしているモジュールは大丈夫だったが、絶対パスがインポートできていなかった。

解決法

jest 設定ファイルで jest の設定をする。今回は package.json で設定する。

修正点は 2 つ。

  • rootDirを削除。
  • moduleDiractories<rootDir> を追加。
package.json
@@ -60,7 +60,6 @@
       "json",
       "ts"
     ],
-    "rootDir": "src",
     "testRegex": ".*\\.spec\\.ts$",
     "transform": {
       "^.+\\.(t|j)s$": "ts-jest"
@@ -72,7 +71,7 @@
     "testEnvironment": "node",
     "moduleDirectories": [
       "node_modules",
-      "."
+      "<rootDir>"
     ]
   }
 }

説明

1. rootDir

デフォルトは package.json があるディレクトリ。nest new で作成したディレクトリ構成のままならデフォルトのままでいいので削除する。

なお、rootDir は jest 設定内では<rootDir> で参照できる。

2. moduleDirectories

モジュールのインポート先を指定する設定。そこにルートディレクトリを追加する。

それによって絶対パスでインポートできるようになる。

参考記事

Jest + Typescript + Absolute paths (baseUrl) gives error: Cannot find module

Jest の設定 · Jest moduleDirectories

Jest の設定 · Jest rootDir

Discussion