NestJSのサービス層のテストとE2Eテストのimport文を絶対パスで記述する
NestJSでのテストで、import文を相対パスではなくて絶対パスで記述する方法について、メモとして残しておきます。
ちなみに、デフォルトで生成されるテストは相対パスで記述されています。
↓相対パス(デフォルトで生成されるテスト)
import { AppModule } from './../src/app.module';
↓絶対パス(こうしたい)
import { AppModule } from 'src/app.module';
結論
サービス・コントローラのテストとE2Eテストで設定する場所・内容が異なります。
サービス・コントローラのテスト
package.json
にmoduleNameMapper
の設定を追加します。
{
"jest": {
(略)
"moduleNameMapper": {
"src(.*)$": "<rootDir>/$1"
}
}
}
E2Eテスト
test/jest-e2e.json
にmoduleNameMapper
の設定を追加します。
{
(略)
"moduleNameMapper": {
"src/(.*)$": "<rootDir>/../src/$1"
}
}
解説
テスト内のimport文を絶対パスで記述する際に、jest.config.js
などに、moduleNameMapper
の記載を記載するケースはよくあると思います。
(moduleNameMapper
は特定のパスをprefixに置き換えてくれる設定)
なので、pacakge.json
にこの設定をすれば良い、というところまではすぐ辿りついて、これによってサービス・コントローラのテストは絶対パスで記述できるようになったのですが、E2Eテストを絶対パスで記述できず、少し悩みました。
なぜpackage.jsonの設定だけではE2Eテスト内で絶対パスが有効にならないか
package.json
のjest
のrootDir
の設定がsrc
になっている一方で、E2Eテストはsrc
の外側のディレクトリにあるからです。
E2Eテストのjestの設定はどこにどのように書けば良いか
package.json
のtest:e2e
コマンドの定義を見てみます。
コマンドはjest --config ./test/jest-e2e.json
のようになっているため、設定はtest/jest-e2e.json
に書けばよいことがわかります。
rootDir
が.
(カレントディレクトリ)となっているため、ディレクトリを一つ遡った上でsrcへのパスを記載します(以下の記載)。
"moduleNameMapper": {
"src/(.*)$": "<rootDir>/../src/$1"
}
以上、まぁそりゃそうだよな、という内容ですが、少し詰まったのでメモとして残しておきます。
Discussion