React Jest 自動テストコツ

カバレッジ100%にしろよ教に立ち向かうためのメモ
API部の関数テスト

import * as apiHandler from '../components/Presets/api'

describe('update', () => {
	test('updatePreset', async () => {
	  // 1、関数の引数
		const name = 'プリセット001'
		//     正常系モック(成功パターンを擬似的に表現できる)
		const mockedResponse: AxiosResponse | any = {
			data: {},
			status: 200,
			statusText: 'OK',
			headers: { 'content-type': 'application/json' },
      config: {},
      request: {}
		}
		jest.spyOn(axios, 'put').mockResolvedValueOnce(mockedResponse);
		jest.spyOn(apiHandler, 'fetchToken').mockResolvedValue(token);
		const mockPutPreset = jest.spyOn(apiHandler, 'putPreset').mockResolvedValueOnce(mockedResponse)
		const setLoading = jest.fn()
		
		// 2、テストしたい関数
		await apiHandler.updatePreset(name, setLoading)
		
		// 3、テストしたい内容
		waitFor(() => {
		  expect(mockPutPreset).toHaveBeenCalled()
		  expect(setLoading).toHaveBeenCalled()
		})
	})
})

【ポイント】

  • jotaiライブラリーからできたsetLoadingでもどんな関数でもモック化して、引数に与えてあげればOK

  • jest.spyOnでモジュール読み込みし、mockResolvedValueOnceやmockResolvedValueで成功時の値を指定すると擬似的に成功した状態で返してくれる

  • ↑注意:ネスト深い他の非同期関数がある場合は、そいつも擬似的に成功するように用意しないといけない。今回の場合は以下の2行を指す。

  • ちなみにwaitForは、何でもかんでもpassする可能性があるので、期待値と期待値以外を確かめて信ぴょう性の確認しましょう。

jest.spyOn(axios, 'put').mockResolvedValueOnce(mockedResponse);
jest.spyOn(apiHandler, 'fetchToken').mockResolvedValue(token);

chatGPT参考

jest.spyOnとjest.mock使い道

jest.spyOn を使用しても getPreset 関数の呼び出しを監視(スパイ)し、その動作をテスト中に検証することができます。spyOn は、元の関数の実装を保持しながらその呼び出しを追跡したり、特定の戻り値を返すように上書きしたりすることが可能です。これは、関数がどのように、そしてどこで呼び出されているかを知りたい場合に特に便利です。

getPreset をスパイする方法

以下のステップで、getPreset 関数のスパイを設定し、そのテストを実行する方法を説明します。

ステップ 1: getPreset のインポート

まず、テストしたい関数 getPreset をインポートします。これは通常、API呼び出しを行う外部のモジュールからのインポートになります。

javascriptCopy code
// api.js モジュールから getPreset 関数をインポート
import { getPreset } from './api';

ステップ 2: spyOn で関数をスパイ

jest.spyOn を使って getPreset 関数をスパイします。そして、mockResolvedValue を使ってスパイされた関数が特定の値を返すように設定します。

javascriptCopy code
describe('loadPreset', () => {
  it('loads preset data and sets states correctly', async () => {
    // getPreset 関数をスパイし、プロミスが解決された値をモックします
    jest.spyOn(api, 'getPreset').mockResolvedValue({
      name: 'Test Name',
      description: 'Test Description',
      system: 'Test System',
      user: 'Test User'
    });

    // その他のモック関数
    const setLoading = jest.fn();
    const setName = jest.fn();
    const setDescription = jest.fn();
    const setSystem = jest.fn();
    const setUser = jest.fn();

    // 関数を呼び出し
    await loadPreset('123', 'token', setLoading, setName, setDescription, setSystem, setUser);

    // getPreset が適切な引数で呼び出されたことを確認
    expect(api.getPreset).toHaveBeenCalledWith('123', 'token');
    // その他の期待
  });
});

ステップ 3: テスト後のクリーンアップ

afterEachafterAll フックを使用して、テスト後にモックやスパイをリセットすることが重要です。これにより、他のテストに影響を与えることなく、テスト間の依存性を排除できます。

javascriptCopy code
afterEach(() => {
  jest.restoreAllMocks(); // すべてのモック/スパイをリセット
});

注意点

  • スパイを使用すると、元の関数の呼び出しを"覗き見"することができますが、必要に応じてその振る舞いを変更することもできます。

  • jest.spyOn は、モック化と異なり、元の関数の挙動を保持するオプションも提供します。これは、関数の元の実装を維持しながら、その呼び出しや返された値を検証したい場合に役立ちます。

この方法を使えば、getPreset 関数の呼び出しやそのパラメータ、戻り値を効果的にテストできるようになります。

この記事が気に入ったらサポートをしてみませんか?