個人開発で扱う Jest モックの使い方

要約
モジュールやファイルをモック(模擬)するために使用される。モック関数は、実際の関数の振る舞いを模倣しているが、実際の関数の実行を防ぐ。
意見はこのエリアに表示されます

Next.js や Supabase を使って個人開発を行う際、Jest モックを使ってテストを行うときによく使う方法をまとめる。

jest モック

モックとは、テスト中に実際の関数やオブジェクトを置き換えることで、テストの独立性を確保する手法。

jest.mock

モジュールやファイルをモック(模擬)するために使用される。モック関数は、実際の関数の振る舞いを模倣しているが、実際の関数の実行を防ぐ。

例えば、Supabase クライアントをモック化する場合は、以下のように記述する。

実際のデータベース(Supabase)に依存せずに、関数の動作を独立させてテストする。

実際のデータベース通信を防ぐために createClient 関数をモック化する。

これにより、テスト中に実際の Supabase クライアントを使用する代わりに、モックされたバージョンを使用することができる。

概ね、以下のような流れになる。

  1. createClient をインポート
  2. jest.mock を使用して、Supabase モジュールをモック化
  3. 操作が成功する場合(正常系)のテスト
  4. 失敗する場合(異常系)のテスト
  5. beforeEach でモックをリセット

jest.fn()

jest.fn() はモック関数を生成。この関数は、テスト内で呼び出された回数や引数を追跡できるほか、戻り値をカスタマイズできる。

以下のオブジェクトは、データベースクライアント(例えば Supabase クライアント)の振る舞いをシミュレートしている。

from()

テーブルを指定する。

select()

取得するカラムを指定する。* を指定すると全カラムを取得する。

eq(column, value)

特定のカラムで条件を指定する。

in(column, values)

指定したカラムが複数の値に一致するかどうかを確認する。

order(column, options)

取得したデータを指定のカラムでソートする。

range(from, to)

取得するデータの範囲を指定(例: ページネーション)。

limit(count)

取得する行数の上限を設定する。

single()

取得するデータを 1 行に制限する。

insert(data)

データを挿入する。

update(data)

データを更新する。

delete()

データを削除する。

非同期エラーハンドリング

Supabase クエリが失敗するケースも考慮して、エラーハンドリングをテストに組み込むのが重要です。

mockReturnThis()

このメソッドは、モック関数が呼ばれた際に、自分自身 (this) を返す。チェーンメソッド(例えば mockClient.from().select().eq() のように連続して呼び出す構造)のテストに便利。

mockReturnValue(value)

このメソッドは、モック関数が呼ばれた際に指定した値を返すように設定する。

mockResolvedValueOnce

非同期関数の戻り値をシミュレートする。

toHaveBeenCalledWith

モック関数が特定の引数で呼び出されたかどうかを検証する。指定した引数でモック関数が少なくとも一度は呼び出されたことを確認。

as jest.Mock

as jest.Mock : モック関数を型アサーションする。

TypeScript を使用して Jest テストを記述する際に、特定のオブジェクトや関数を Jest のモック関数として扱うためのキャスト(型変換)。

モックをリセットする

テストの独立性を確保するために、各テストケースの前後にモックをリセットする。

Explore More
関連記事はありません。