🙄

NestJSのサービス層のテストとE2Eテストのimport文を絶対パスで記述する

2023/05/27に公開

NestJSでのテストで、import文を相対パスではなくて絶対パスで記述する方法について、メモとして残しておきます。
ちなみに、デフォルトで生成されるテストは相対パスで記述されています。

↓相対パス(デフォルトで生成されるテスト)

import { AppModule } from './../src/app.module';

↓絶対パス(こうしたい)

import { AppModule } from 'src/app.module';

結論

サービス・コントローラのテストとE2Eテストで設定する場所・内容が異なります。

サービス・コントローラのテスト

package.jsonmoduleNameMapperの設定を追加します。

package.json
{
  "jest": {
    (略)
    "moduleNameMapper": {
      "src(.*)$": "<rootDir>/$1"
    }
  }
}

E2Eテスト

test/jest-e2e.jsonmoduleNameMapperの設定を追加します。

test/jest-e2e.json
{
  (略)
  "moduleNameMapper": {
    "src/(.*)$": "<rootDir>/../src/$1"
  }
}

解説

テスト内のimport文を絶対パスで記述する際に、jest.config.jsなどに、moduleNameMapperの記載を記載するケースはよくあると思います。
moduleNameMapperは特定のパスをprefixに置き換えてくれる設定)

なので、pacakge.jsonにこの設定をすれば良い、というところまではすぐ辿りついて、これによってサービス・コントローラのテストは絶対パスで記述できるようになったのですが、E2Eテストを絶対パスで記述できず、少し悩みました。

なぜpackage.jsonの設定だけではE2Eテスト内で絶対パスが有効にならないか

package.jsonjestrootDirの設定がsrcになっている一方で、E2Eテストはsrcの外側のディレクトリにあるからです。

E2Eテストのjestの設定はどこにどのように書けば良いか

package.jsontest:e2eコマンドの定義を見てみます。
コマンドはjest --config ./test/jest-e2e.jsonのようになっているため、設定はtest/jest-e2e.jsonに書けばよいことがわかります。
rootDir.(カレントディレクトリ)となっているため、ディレクトリを一つ遡った上でsrcへのパスを記載します(以下の記載)。

  "moduleNameMapper": {
    "src/(.*)$": "<rootDir>/../src/$1"
  }

以上、まぁそりゃそうだよな、という内容ですが、少し詰まったのでメモとして残しておきます。

Discussion