Open5

Jest で Mockの作成について

まさぴょんまさぴょん

jest.spyOn()や、mockResolvedValue()について

Jestとモックの基本

Jestは、JavaScriptのユニットテストフレームワークで、テストを容易に書くための多くの機能を提供しています。その中でも、モックやスパイは、外部依存や副作用を持つコードをテストする際に非常に有用です。

  • モック(Mock):実際の実装を置き換える偽物の関数やモジュール。外部依存を排除し、テストを制御された環境で行うために使用します。
  • スパイ(Spy):既存の関数の呼び出しを監視し、呼び出し回数や引数などの情報を取得します。元の実装をそのまま使う場合や、一部だけをモックしたい場合に便利です。

jest.spyOn()

概要

jest.spyOn()は、オブジェクトの特定のメソッドをスパイするための関数です。このメソッドを使用すると、その関数が呼び出されたかどうか、何回呼び出されたか、どのような引数で呼び出されたかを追跡できます。また、必要に応じてその関数の実装をモックすることも可能です。

使用方法

const spy = jest.spyOn(obj, 'methodName');
  • obj:監視したいメソッドを持つオブジェクト。
  • methodName:スパイしたいメソッドの名前(文字列)。

const calculator = {
  add(a, b) {
    return a + b;
  },
};

test('addメソッドが正しく呼ばれる', () => {
  const spy = jest.spyOn(calculator, 'add');

  const result = calculator.add(2, 3);

  expect(spy).toHaveBeenCalled(); // 呼び出されたことを確認
  expect(spy).toHaveBeenCalledWith(2, 3); // 引数を確認
  expect(result).toBe(5); // 戻り値を確認

  spy.mockRestore(); // スパイを解除し元の状態に戻す
});

ポイント

  • スパイは元の実装を維持するため、副作用を持つ関数をそのままテストできます。
  • mockImplementation()mockReturnValue()を使用して、スパイした関数の挙動を変更できます。

mockResolvedValue()

概要

mockResolvedValue()は、Promiseを返す非同期関数のモックに対して、解決された値を指定するためのメソッドです。これにより、非同期処理の結果を制御し、テストを容易に行えます。

使用方法

const mockFn = jest.fn().mockResolvedValue(value);

または、既存のモック関数やスパイに対して:

mockFn.mockResolvedValue(value);

const fetchData = () => {
  return Promise.resolve('リアルデータ');
};

test('fetchDataがモックデータを返す', async () => {
  jest.spyOn(global, 'fetchData').mockResolvedValue('モックデータ');

  const data = await fetchData();

  expect(data).toBe('モックデータ'); // モックされた値を確認

  global.fetchData.mockRestore(); // スパイを解除
});

ポイント

  • 非同期関数のテストで、実際の外部リソースへのアクセスを避けるために使用します。
  • mockRejectedValue()を使用すると、Promiseが拒否された場合のテストも可能です。

jest.spyOn()mockResolvedValue()の組み合わせ

これらのメソッドを組み合わせることで、特定の関数の呼び出しを監視しつつ、その戻り値をモックすることができます。

const api = {
  getUser(id) {
    // 実際には外部APIを呼び出す処理
    return fetch(`/users/${id}`).then(response => response.json());
  },
};

test('getUserがモックユーザーを返す', async () => {
  const mockUser = { id: 1, name: 'モックユーザー' };
  const spy = jest.spyOn(api, 'getUser').mockResolvedValue(mockUser);

  const user = await api.getUser(1);

  expect(spy).toHaveBeenCalledWith(1); // 引数を確認
  expect(user).toEqual(mockUser); // モックされたユーザーを確認

  spy.mockRestore(); // スパイを解除
});

ポイント

  • 外部APIへの依存を排除し、テストを高速かつ安定的に行えます。
  • スパイにより、関数の呼び出し状況を詳細に検証できます。

その他の関連メソッド

  • jest.fn():新しいモック関数を作成します。
  • mockImplementation(fn):モック関数の実装を指定します。
  • mockReturnValue(value):モック関数が返す値を指定します(同期関数向け)。
  • mockRejectedValue(error):Promiseを返す関数の拒否理由を指定します。

まとめ

  • jest.spyOn()は、既存のオブジェクトメソッドをスパイし、その呼び出しを監視・操作できます。
  • mockResolvedValue()は、非同期関数のモックに対して、Promiseの解決値を指定します。
  • これらを組み合わせることで、非同期処理や外部依存を持つコードのテストを効果的に行えます。
まさぴょんまさぴょん

Jestでのモック関数の状態を管理・リセット方法について

Jestでは、モック関数の状態を管理・リセットするために、以下のメソッドが提供されています。
これらのメソッドの違いを理解することで、テストの精度と保守性を向上させることができます。

メソッド名 説明 主な用途
mockClear() モック関数の呼び出し履歴(mock.callsmock.instancesmock.results)をクリアします。 テスト間でモック関数の呼び出し履歴をリセットしたい場合。
mockReset() mockClear()の機能に加え、モック関数の実装や戻り値の設定もリセットします。 モック関数を完全に初期状態に戻したい場合。
mockRestore() jest.spyOn()で作成されたモックを元の実装に戻します。 スパイされた関数を元の実装に戻したい場合。
jest.clearAllMocks() すべてのモック関数の呼び出し履歴をクリアします。 プロジェクト内のすべてのモック関数の呼び出し履歴を一括でクリアしたい場合。
jest.resetAllMocks() すべてのモック関数の状態と実装をリセットします。 プロジェクト内のすべてのモック関数を完全に初期状態に戻したい場合。
jest.restoreAllMocks() すべてのスパイされたモックを元の実装に戻します。 プロジェクト内のすべてのスパイされた関数を元の実装に戻したい場合。

補足

  • mockClear()は、モック関数の呼び出し履歴をクリアしますが、モックの実装や戻り値の設定は維持されます。

  • mockReset()は、呼び出し履歴のクリアに加え、モックの実装や戻り値の設定もリセットします。

  • mockRestore()は、jest.spyOn()で作成されたモックを元の実装に戻します。jest.fn()で作成されたモックには適用できません。

  • jest.clearAllMocks()jest.resetAllMocks()jest.restoreAllMocks()は、プロジェクト内のすべてのモック関数に対して一括で操作を行います。

これらのメソッドを適切に使用することで、テスト間の副作用を防ぎ、安定したテストコードを維持することができます。