0
0

[Node.js] [Jest] 単体テストにおける jest.spyOn の使い方

Last updated at Posted at 2024-08-18

環境

MacBook Pro (2.3 GHz 8コアIntel Core i9)
macOS 14.0(23A344)
Homebrew 4.3.8
gh 2.52.0

目次

jest.spyOn(object, methodName)の基本構文

jest.fnと同様の関数を作成しますが、引数に与えられたobject[methodName]へのコールも実装します。 Jestの モック関数を返します。

xx.test.ts
const spy = jest.spyOn(object, methodName);

mockFn.mockResolvedValueOnce(value)の基本構文

モック関数を1回呼び出したときに返す値を受け取ります。 次のモック関数へのコールが異なる値を返せるようチェーンすることができます。

xx.test.ts
const spy = jest.spyOn(object, methodName);
spy.mockResolvedValueOnce(value);

活用例1

テスト対象の関数

APIからデータを取得する関数fetchUserDataがあり、それをテストするとします。この関数は、getUserという外部の関数を使ってデータを取得します。

userService.ts
// テスト対象の関数
export const getUser = async (id: number) => {
    // 実際にはAPIからユーザー情報を取得する処理がある(実際のコードではなく、構造や流れを示すためのサンプル関数)
    return { id, name: "John Doe" };
};

export const fetchUserData = async (id: number) => {
    const user = await getUser(id);
    return user.name;
};

テストデータ

userService.fixture.ts
// テストデータ
const mockUserData = { id: 1, name: "Alice" };

単体テストコード

userService.test.ts
import { fetchUserData, getUser } from './userService';
import { mockUserData } from './userService.fixture';

test('fetchUserData should return user name', async () => {
    // Arrange
    // getUser関数をスパイして、モックデータを返すように設定
    const getUserSpy = jest.spyOn(require('./userService'), 'getUser')
    getUserSpy.mockResolvedValueOnce(mockUserData);

    // Act
    // fetchUserDataを実行
    const userName = await fetchUserData(1);

    // Assert
    // getUserが正しく呼び出されているかを確認
    expect(getUserSpy).toHaveBeenCalledWith(1);
    // fetchUserDataが返す値がモックデータの名前であることを確認
    expect(userName).toBe("Alice");
});

活用例1のアルゴリズムイメージ

image.png

参考リンク

メイン

AAA

  • 単体テストメソッドのArrangeセクションでは、オブジェクトを初期化し、テスト対象のメソッドに渡されるデータの値を設定します。
  • Actセクションでは、設定されたパラメーターでテスト対象のメソッドを呼び出します。
  • Assertセクションでは、テスト対象のメソッドの操作が予測どおりに動作することを検証します。.NETでは、多くの場合、Assertクラスのメソッドが検証に使用されます。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0