NestJS は Node.js 向けのウェブフレームワークです。その特徴として Decorator を用いてクラスやメソッドにアノテーションをする仕組みを提供しています。
例えば API のエンドポイントを定義する場合は次のようなコードを実装します。
import { Controller, Get } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() findAll(): string { return 'This action returns all cats'; } }
高速な TypeScript のトランスパイラの実装として esbuild や SWC が有名です。今回は SWC の jest binding である @swc/jest を ts-jest の代わりに使用して、NestJS 製のプロジェクトのテストを実行する方法を紹介します。
サンプルコードは以下のリポジトリにあります。
SWC は .swcrc
ファイルで設定を管理します。デコレータを有効にしたり、NestJS の DI のためにクラス名を維持する設定をします。
{ "jsc": { "parser": { "syntax": "typescript", "tsx": false, "decorators": true }, "target": "es2017", "keepClassNames": true, "transform": { "legacyDecorator": true, "decoratorMetadata": true } }, "module": { "type": "commonjs", "noInterop": true } }
jest.config.js
は @swc/jest
の README にある通りに設定します。
const fs = require('fs') const config = JSON.parse(fs.readFileSync(`${__dirname}/.swcrc`, 'utf-8')) module.exports = { transform: { '^.+\\.(t|j)sx?$': ['@swc/jest', { ...config, /* custom configuration in jest */ }], }, }
これで NestJS 製のプロジェクトのテストのトランスパイラに @swc/jest
を使用することができるようになりました。
上記のサンプルリポジトリのテストを GitHub Actions 上で実行したときに、ts-jest
だと3.42秒かかっていたのが、@swc/jest
だと0.79秒に短縮されました。