【ITニュース解説】Mock Prisma with Jest in NestJS
2025年09月05日に「Dev.to」が公開したITニュース「Mock Prisma with Jest in NestJS」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
NestJSでPrismaを使うサービスのテスト時、JestでPrismaServiceをモックする方法を紹介。テスト用にPrismaServiceの型を定義し、`findMany`などのメソッドを`jest.fn()`でモック化。`Test.createTestingModule`でモックを`useValue`として登録し、テスト対象のサービスに注入。これにより、実際のDB接続なしで、メソッドの呼び出しや戻り値を検証可能になる。
ITニュース解説
この記事では、NestJSというフレームワークで開発されたアプリケーションのテストにおいて、PrismaというデータベースクライアントをMock(モック)する方法について解説する。特に、Jestというテストフレームワークと組み合わせて使用する場合に、TypeScriptの型定義を活用して、より安全かつ効率的にモックを作成するパターンを紹介している。
まず、NestJSとPrisma、Jestという3つの技術要素について簡単に説明する。
NestJSは、スケーラブルなサーバーサイドアプリケーションを構築するためのフレームワークだ。TypeScriptで記述され、構造化されたアーキテクチャを提供することで、開発者が保守性の高いコードを書くのを支援する。
Prismaは、データベースへのアクセスを簡単にするためのORM(Object-Relational Mapper)だ。データベーススキーマを定義し、TypeScriptの型安全性を提供しながら、データベース操作を行うためのクライアントを生成する。これにより、生のSQLクエリを書く手間を省き、開発効率を向上させることができる。
Jestは、JavaScriptとTypeScriptのためのテストフレームワークだ。シンプルなAPI、高速な実行速度、そして豊富な機能により、開発者はユニットテスト、結合テスト、E2Eテストなど、さまざまな種類のテストを容易に記述できる。
さて、本題のPrismaのモックについて説明する。テスト対象のサービスがPrismaクライアントを使用してデータベースにアクセスする場合、テスト中に実際のデータベースに接続するのは望ましくない。なぜなら、テストデータを用意したり、データベースの状態を管理したりする必要があるからだ。そこで、Prismaクライアントの代わりに、モックオブジェクトを使用する。モックオブジェクトは、実際のPrismaクライアントの振る舞いを模倣するもので、テスト中に特定の値を返すように設定できる。
記事で紹介されているモックの手法は、以下の手順で行われる。
-
モックオブジェクトの型定義: まず、モックオブジェクトの型を定義する。これは、TypeScriptのインターフェースまたは型エイリアスを使用して行う。この型定義では、モックするPrismaクライアントのメソッド(例えば、
findManyなど)を定義し、それぞれのメソッドの戻り値の型を指定する。jest.Mock型を使用することで、これらのメソッドがJestのモック関数であることを明示する。 -
モックオブジェクトの作成と提供: 次に、実際にモックオブジェクトを作成し、NestJSの依存性注入の仕組みを使って、テスト対象のサービスに提供する。
Test.createTestingModuleメソッドを使用してテストモジュールを作成し、providers配列にモックオブジェクトを登録する。provideプロパティには、モックするサービス(ここではPrismaService)を指定し、useValueプロパティには、作成したモックオブジェクトを指定する。 -
モックオブジェクトの取得: テストモジュールから、モックオブジェクトを取得する。
module.get(PrismaService)メソッドを使用することで、テストモジュールにバインドされたモックオブジェクトを取得できる。 -
モックの設定と検証: 最後に、取得したモックオブジェクトのメソッドに対して、期待される振る舞いを設定し、テストを実行する。
mockResolvedValueメソッドを使用して、モックメソッドが返す値を設定する。toHaveBeenCalledメソッドを使用して、モックメソッドが呼び出されたかどうかを検証する。
この方法の利点は、TypeScriptの型定義を活用することで、モックオブジェクトの型安全性を確保できることだ。これにより、テストコードのコンパイル時に、型エラーを検出できる可能性が高まり、より信頼性の高いテストを書くことができる。
例えば、findManyメソッドが特定のオブジェクトの配列を返すことを期待する場合、モックオブジェクトの型定義で、findManyメソッドの戻り値の型をそのオブジェクトの配列として定義する。そして、mockResolvedValueメソッドで、その型のオブジェクトの配列を返すように設定する。もし、間違った型の値を返そうとした場合、TypeScriptコンパイラがエラーを検出し、テストの実行前に問題を修正できる。
このように、NestJS、Prisma、Jestを組み合わせた開発において、TypeScriptの型定義を活用してモックを作成することで、テストの品質を向上させ、より堅牢なアプリケーションを構築できる。この記事は、そのための具体的なパターンを示している。