Open2

Jestのよく使用するテストパターン・チートシート🌟

まさぴょんまさぴょん

「作成日時の昇順で返る」ことをテストする

        // 作成日時の昇順で返る
        const createdAts = actual.map((a) => a.createdAt);
        const sortedCreatedAts = [...createdAts].sort(
          (a: Date, b: Date) => a.getTime() - b.getTime(),
        );
        expect(createdAts).toStrictEqual(sortedCreatedAts);
まさぴょんまさぴょん

Jest における関数呼び出し・マッチャーのテスト整理

Jest は JavaScript のテストフレームワークであり、モック関数の呼び出しや引数、返り値を検証するための多くのマッチャを提供しています。
これらのマッチャを理解することで、より効果的なテストを書くことができます。

1. toHaveBeenCalled()

  • 説明: モック関数が少なくとも1回呼び出されたことを確認します。
  • 使用例:
    expect(mockFunction).toHaveBeenCalled();
    

2. toHaveBeenCalledTimes(number)

  • 説明: モック関数が指定した回数だけ呼び出されたことを確認します。
  • 使用例:
    expect(mockFunction).toHaveBeenCalledTimes(3);
    

3. toHaveBeenCalledWith(arg1, arg2, ...)

  • 説明: モック関数が指定した引数で呼び出されたことを確認します(少なくとも1回)。
  • 使用例:
    expect(mockFunction).toHaveBeenCalledWith('arg1', 'arg2');
    

4. toHaveBeenLastCalledWith(arg1, arg2, ...)

  • 説明: モック関数の最後の呼び出しが指定した引数であったことを確認します。
  • 使用例:
    expect(mockFunction).toHaveBeenLastCalledWith('lastArg');
    

5. toHaveBeenNthCalledWith(nthCall, arg1, arg2, ...)

  • 説明: モック関数の n 回目の呼び出しが指定した引数であったことを確認します。
  • 使用例:
    expect(mockFunction).toHaveBeenNthCalledWith(2, 'secondCallArg');
    

6. toHaveReturned()

  • 説明: モック関数が少なくとも1回正常に値を返したことを確認します。
  • 使用例:
    expect(mockFunction).toHaveReturned();
    

7. toHaveReturnedTimes(number)

  • 説明: モック関数が指定した回数だけ値を返したことを確認します。
  • 使用例:
    expect(mockFunction).toHaveReturnedTimes(2);
    

8. toHaveReturnedWith(value)

  • 説明: モック関数が指定した値を返したことを確認します(少なくとも1回)。
  • 使用例:
    expect(mockFunction).toHaveReturnedWith('returnValue');
    

9. toHaveLastReturnedWith(value)

  • 説明: モック関数の最後の返り値が指定した値であったことを確認します。
  • 使用例:
    expect(mockFunction).toHaveLastReturnedWith('lastReturnValue');
    

10. toHaveNthReturnedWith(nthCall, value)

- **説明**: モック関数の n 回目の返り値が指定した値であったことを確認します。
- **使用例**:
  ```javascript
  expect(mockFunction).toHaveNthReturnedWith(1, 'firstReturnValue');
  ```

マッチャー比較表

マッチャ 説明 使用例
toHaveBeenCalled() 関数が少なくとも1回呼び出された expect(fn).toHaveBeenCalled();
toHaveBeenCalledTimes(number) 関数が指定回数呼び出された expect(fn).toHaveBeenCalledTimes(3);
toHaveBeenCalledWith(...args) 関数が指定引数で呼び出された(少なくとも1回) expect(fn).toHaveBeenCalledWith(arg1, arg2);
toHaveBeenLastCalledWith(...args) 最後の呼び出しが指定引数であった expect(fn).toHaveBeenLastCalledWith(arg1, arg2);
toHaveBeenNthCalledWith(n, ...args) n 回目の呼び出しが指定引数であった expect(fn).toHaveBeenNthCalledWith(2, arg1, arg2);
toHaveReturned() 関数が少なくとも1回値を返した expect(fn).toHaveReturned();
toHaveReturnedTimes(number) 関数が指定回数値を返した expect(fn).toHaveReturnedTimes(2);
toHaveReturnedWith(value) 関数が指定値を返した(少なくとも1回) expect(fn).toHaveReturnedWith('value');
toHaveLastReturnedWith(value) 最後の返り値が指定値であった expect(fn).toHaveLastReturnedWith('value');
toHaveNthReturnedWith(n, value) n 回目の返り値が指定値であった expect(fn).toHaveNthReturnedWith(1, 'value');

類似用語の説明と比較

  • jest.fn()

    • 説明: モック関数を作成するための Jest のメソッド。関数の呼び出しや引数、返り値を追跡できます。
    • 使用例:
      const mockFunction = jest.fn();
      
  • jest.spyOn(object, methodName)

    • 説明: 既存のオブジェクトのメソッドをスパイ(モック)し、その呼び出しや引数を追跡します。
    • 使用例:
      const spy = jest.spyOn(obj, 'methodName');
      
  • モック関数とスパイの比較

    • モック関数(Mock Functions): 独立したモック関数を作成し、テスト内で使用します。元の実装とは無関係です。
    • スパイ(Spies): 既存の関数をラップして、その呼び出しや引数を監視します。元の実装を保持するか、モックするかを選択できます。
  • mockImplementation()

    • 説明: モック関数に特定の実装を提供します。
    • 使用例:
      mockFunction.mockImplementation(() => 'returnValue');
      
  • mockClear()mockReset() の比較

    • mockClear(): モック関数の呼び出し履歴やインスタンスをクリアしますが、モックの実装は保持します。
    • mockReset(): モック関数の全てのデータと実装をリセットします。

具体的な例

  1. 関数が呼び出されたか確認

    test('関数が呼び出されることを確認', () => {
      const mockFunction = jest.fn();
      mockFunction();
      expect(mockFunction).toHaveBeenCalled();
    });
    
  2. 特定の引数で呼び出されたか確認

    test('特定の引数で関数が呼び出されることを確認', () => {
      const mockFunction = jest.fn();
      mockFunction('arg1', 'arg2');
      expect(mockFunction).toHaveBeenCalledWith('arg1', 'arg2');
    });
    
  3. 特定の値を返したか確認

    test('関数が特定の値を返すことを確認', () => {
      const mockFunction = jest.fn(() => 'returnValue');
      mockFunction();
      expect(mockFunction).toHaveReturnedWith('returnValue');
    });
    

まとめ

Jest のこれらのマッチャを活用することで、関数の呼び出し回数、引数、返り値などを詳細にテストできます。
これは特に、コールバック関数の検証や、関数間のインタラクションを確認する際に有用です。

これらのマッチャやメソッドを理解し、適切に使用することで、テストコードの品質と信頼性を向上させることができます。