モックオブジェクトの使用 | モックとスタブ | JavaScript 超完全入門 基本から発展までのすべて

スポンサーリンク
スポンサーリンク

モックオブジェクトとは?

テストにおいてモックオブジェクト(Mock Object)は、依存関係のあるオブジェクトを模倣し、期待する動作をシミュレートするオブジェクトのことです。実際のオブジェクトの代わりに使用され、テスト環境での動作をより簡単に管理するために用いられます。

モックオブジェクトは、テストの際に呼び出されるメソッドが正しく動作しているか確認するためのもので、メソッドが呼び出された回数や引数などを検証する際に役立ちます。

モックオブジェクトの役割

モックオブジェクトは、次のような状況で役立ちます。

  • 外部サービスとの依存を排除する: APIやデータベースなど、外部リソースに依存する処理をテストする際、実際のリソースにアクセスせずにテストが行えます。
  • テストの速度を向上させる: 実際のリソースへのアクセスを避けることで、テストの実行速度が速くなります。
  • 呼び出しの検証: メソッドが適切に呼び出されたかどうかを検証でき、テストの精度を高めます。

モックオブジェクトの使い方

以下に、モックオブジェクトを使用したテストの基本的な流れを紹介します。

  1. モックオブジェクトを作成する:テスト対象の関数が依存している外部オブジェクトをモック化します。例えば、APIを呼び出すオブジェクトやデータベース操作のオブジェクトです。
  2. メソッドの動作を定義する:モックオブジェクトのメソッドが呼び出された際に、特定の返り値や動作をシミュレートするように設定します。
  3. モックを使用したテストを実行する:テスト対象のコードを実行し、モックオブジェクトが正しく動作しているか確認します。メソッドが正しい引数で呼び出されたかどうかも検証します。
  4. 結果を検証する:テストが終了したら、期待した通りの結果が得られたかを検証します。モックが期待通りに動作したことを確認します。

具体例: モックオブジェクトを使ったJavaScriptテスト

次に、fetchData関数が外部APIを呼び出すシナリオでモックオブジェクトを使用する例を紹介します。

ステップ1: モックオブジェクトを作成する

const fetchData = require('./fetchData');

const mockApi = {
  getData: jest.fn(() => Promise.resolve({ data: 'sample data' }))
};

ここではmockApiオブジェクトを作成し、その中のgetDataメソッドが呼び出された際、{ data: 'sample data' }というレスポンスを返すように設定しています。

ステップ2: モックオブジェクトをテストに組み込む

test('fetchData calls API and returns data', async () => {
  const result = await fetchData(mockApi);
  expect(result.data).toBe('sample data');
  expect(mockApi.getData).toHaveBeenCalled();
});

ここでは、fetchDataがモックAPIを呼び出し、期待したデータが返ってくるかを確認しています。また、mockApi.getDataが正しく呼び出されたことも検証しています。

ステップ3: 結果を検証する

テストが実行されると、モックオブジェクトが作動し、APIの実際の呼び出しを行う代わりにシミュレートされたレスポンスを返します。これにより、外部サービスに依存せずにテストを行うことができます。

モックオブジェクトのメリット

モックオブジェクトを使用することには多くのメリットがあります。

  • 依存関係を排除できる: モックを使用することで、外部サービスやデータベースなどの依存関係に左右されないテストが可能です。
  • テストが高速になる: 外部リソースにアクセスしないため、テストの実行時間が大幅に短縮されます。
  • 信頼性の向上: モックによって正確な動作を確認でき、コードの品質を向上させます。

モックとスタブの違い

テストでよく使われる用語にモックスタブがありますが、これらは似て非なるものです。

モック スタブ
オブジェクトのメソッドの呼び出し状況や引数を確認し、期待された動作を再現します。 特定のデータやレスポンスを返すために使われ、テストの制御に使われます。メソッドの呼び出し状況は確認しません。

まとめ

モックオブジェクトは、依存関係のある外部サービスやオブジェクトをシミュレートし、テストの柔軟性と効率を向上させます。JavaScriptにおけるテストフレームワークでは、Jestのようにモックを簡単に作成できるツールが多数提供されており、実際の開発で多用される技術です。

モックを使うことで、外部の要素に影響されず、迅速かつ信頼性の高いテストを実行することが可能になります。