@swc-node/jest を使ってテストを高速化する(v1.5対応版)
Tuesday, July 12, 2022 06:23:00 PM
少し前のブログで @swc-node/jest を使ってテストを高速化する という記事を書いたのですが、最後のまとめで以下のように紹介していました。
ちなみに 1.5系からは tsconfig を読み込むように変更されているのですが、現時点私たちのプロジェクトではビルドが失敗するので、まだ 1.4 系を利用しています。 問題はすでに issue TypeScript path mapping is not working. になっており、 パスエイリアスを使っているときに、うまくファイルが import できないところなのですが、これが解決されれば transformer の設定も不要になるので、 とても便利になるはずです。
そこから他の issue を調べたりしているうちに解決策がわかったので、今回の記事で追記していきます。
@swc-node/jest
の最新版(現時点では 1.5.2
)を使います。
パスエイリアスの指定方法
1.5系からは tsconfig を読み込むので、 jest.config.js
の transform
は以下のように記述すれば良いことになっています。
/** @type {import('@jest/types').Config.InitialOptions} */
const config = {
moduleFileExtensions: ['ts', 'js'],
transform: {
'^.+\\.ts$': ['@swc-node/jest']
},
testMatch: ['**/*.test.ts'],
moduleNameMapper: {
'@/(.*)$': '<rootDir>/$1',
},
};
module.exports = config;
パスエイリアスは moduleNameMapper
に記述されているとおり、テストコードからは @/domain/entities/user-entity
みたいに @
をルートにしてパスエイリアスを使えるようにしています。
で、このままだとパスエイリアスがすべて解決されません、というのが前回までの内容でした。
今回は調べるなかで、以下のように指定することでパスエイリアスがうまく利用できるようになったので、紹介します。
/** @type {import('@jest/types').Config.InitialOptions} */
const config = {
moduleFileExtensions: ['ts', 'js'],
transform: {
'^.+\\.ts$': [
'@swc-node/jest',
// ここから
{
paths: {
'@/*': [`${__dirname}/*`],
}
}
// ここまで
]
},
testMatch: ['**/*.test.ts'],
moduleNameMapper: {
'@/(.*)$': '<rootDir>/$1',
},
};
module.exports = config;
transform
で paths
の指定をするとパスエイリアスが使えるようになります。
tsconfig にも paths
の指定が以下のようになっています
"paths": {
"@/*": ["./*"]
},
で、tsconfig に記述しているとおりコードが書き変わると、そのまま相対パスになってしまい、 インポートパスが見つからないということになっていました。
TypeScript は tsconfig でパスエイリアスを指定するとき ./*
のように書くとプロジェクトルートからの解釈をしてくれるのですが、 swc
ではそのように解釈はしてくれません。
そのため jest.config.js
の transform
で絶対パスに上書きするように記述します。 jest.config.js
はJavaScriptコードなので、 __dirname
を使って絶対パスに変更することができるようになります。
これで安心して @swc-node/jest
も最新版に追従できるようになりました。
もし同じような問題になっている人の手助けになる記事になっていれば幸いです。
Recent Articles
- GAE gen1 で動いている PHP5.5 で作った個人開発サービスを gen2 PHP8.2 へ移行した1年記 〜 その 2 2024/03/20
- GAE gen1 で動いている PHP5.5 で作った個人開発サービスを gen2 PHP8.2 へ移行した1年記 〜 その 1 2024/03/20
- マルチプルレポをモノレポへコミットログを残しながら移行する 2023/09/27
- tsyringe を TypeScript 5 で使う方法 2023/05/02
- LocalStack を使って aws-sdk の Integration Test を実行する 2023/04/19
- AWS SDK v3 のモジュールと利用方法 2023/04/18
- ts-jest が esbuild/swc をトランスフォーマーに使って高速化していた 2023/04/13
- aws-sdk v3 を使うライブラリを作ったときは、なるべく peerDependencies に設定しよう 2023/04/11
- aws-sdk v2 が 2023 年中にメンテナンスモードになる 2023/04/06
- Node.js v18 / aws-sdk v3 の Lambda アプリが突然動かなくなる 2023/04/05