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