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があるディレクトリを指定します。
公式ドキュメントで 多くの場合、リポジトリのどこにソースコードを格納するかによって、 'src' または 'lib'に設定されるでしょう。
と記載がありデフォルトで src
が設定されたと思われます。
modulePaths
はモジュールの依存関係の解決を行うロケーションの絶対パスを配列で指定します。rootDir
に設定した値は他のオプションで'<rootDir>'
で参照可能になるので[“”]とすることで依存解決をルートディレクトリから行うことができるようになります。
コメント