mcpField
J
jest

jest

github.com/mindrallyテスト・品質287869 回インストール3 週間前に更新
リポジトリ

jest について

JavaScriptおよびTypeScriptプロジェクトでJestを使うためのテスト実践スキルです。テスト構成、モック、アサーション、非同期テスト、意味のあるカバレッジを扱います。

主な機能

  1. 01AAA構成による明確なテスト
  2. 02セットアップと後処理の分離
  3. 03Jestのモックパターン
  4. 04具体的なアサーションと否定ケース
  5. 05非同期テストの扱い
  6. 06有意義なカバレッジと境界条件

活用シーン

  1. 01動作ごとのテスト整理
  2. 02テスト間の副作用の分離
  3. 03非同期コードの安定したテスト
  4. 04境界条件とエラー動作の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mindrally/skills --skill jest

インストール後、Claude Code で/jestを入力して読み込まれたか確認します。

詳細

Jest テストのベストプラクティス

JavaScript、TypeScript、Jest テストのエキスパートです。

基本原則

テスト構成
  • 期待される動作を明確に説明する、わかりやすいテスト名を使用します
  • 論理的にグループ化するため、describe ブロックを使ってテストを整理します
  • 各テストで Arrange-Act-Assert(AAA)パターンに従います
  • テストは単一の動作または結果に焦点を絞ります
セットアップと後処理
  • テストを分離するために beforeEach と afterEach を使用します
  • 共有可能なコストの高いセットアップには beforeAll と afterAll を使用します
  • 後処理フックで副作用をすべてクリーンアップします
モック
  • モジュールのモックには jest.mock() を使用します
  • 関数のモックには jest.fn() を使用します
  • 実装は維持したまま呼び出しを追跡する必要がある場合は、jest.spyOn() を使用します
  • jest.clearAllMocks() を使ってテスト間でモックをクリアします
  • モックの使いすぎを避け、可能な場合は実際の動作をテストします
アサーション
  • 利用可能な中で最も具体的なマッチャーを使用します
  • オブジェクトの比較には toEqual、プリミティブ値には toBe を優先します
  • toMatchSnapshot は控えめに使用し、意味のある名前を付けます
  • 否定的なテストケース(起きてはならないこと)も含めます
非同期テスト
  • 非同期テストでは、必ず Promise を返すか、async/await を使用します
  • 非同期のアサーションには、テストライブラリの waitFor を使用します
  • 実行時間の長いテストには適切なタイムアウトを設定します
カバレッジ
  • 単に高い割合を目指すのではなく、有意義なカバレッジを目指します
  • エッジケースとエラー条件をテストします
  • カバレッジ指標を追跡するには --coverage フラグを使用します
ベストプラクティス
  • テストは DRY に保ちつつ、読みやすさも確保します(簡潔さより明確さを優先します)
  • 実装の詳細ではなく、動作をテストします
  • テストの決定性を保ちます(シードを設定せずにランダムデータを使用しないでください)
  • テストデータの作成にはファクトリーやビルダーを使用します

パターンの例

describe('fetchUser', () => {
  it('should return user data when API call succeeds', async () => {
    const mockUser = { id: 1, name: 'John' };
    jest.spyOn(api, 'get').mockResolvedValue(mockUser);

    const result = await fetchUser(1);

    expect(result).toEqual(mockUser);
    expect(api.get).toHaveBeenCalledWith('/users/1');
  });

  it('should throw error when API call fails', async () => {
    jest.spyOn(api, 'get').mockRejectedValue(new Error('Not found'));

    await expect(fetchUser(999)).rejects.toThrow('Not found');
  });
});

コメント