mcpField
R
react-testing

react-testing

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

react-testing について

Testing Library と Vitest で React 19 コンポーネントをテストするための方法論スキルです。ユーザーの操作とアクセシビリティを重視し、セットアップ手順と 9 種類のテストテンプレートを含みます。

主な機能

  1. 01アクセシビリティ対応のクエリを優先
  2. 02userEvent による操作の再現
  3. 03findBy と waitFor による非同期テスト
  4. 04MSW による API モック
  5. 05React 19 と境界のテスト
  6. 06Vitest 設定と 9 種類のテンプレート

活用シーン

  1. 01コンポーネントの操作を検証
  2. 02カスタム Hook と React 19 の機能をテスト
  3. 03アクセシビリティ監査と API 呼び出しのモック

インストール

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

$npx skills add https://github.com/fusengine/agents --skill react-testing

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
accessibility-testing.md
async-testing.md
hooks-testing.md
installation.md
mocking-patterns.md
msw-setup.md
queries.md
react-19-hooks.md
user-events.md
vitest-config.md
references/templates/
accessibility-audit.md
api-integration.md
basic-setup.md
component-async.md
component-basic.md
error-boundary.md
form-testing.md
hook-basic.md
suspense-testing.md

詳細

Testing Library と Vitest を使用して React 19 コンポーネントをテストします。アクセシビリティを優先したユーザー中心のクエリ(まず `getByRole`、最終手段として `getByTestId`)、現実的な操作には `userEvent`(`fireEvent` は使用しません)、非同期アサーションには `findBy`/`waitFor`(`setTimeout` は使用しません)、API のモックには MSW(`fetch` を直接モックしません)を使用します。

React 19 の機能(useActionState、use())、カスタムフック、Suspense 境界、エラー境界、axe-core によるアクセシビリティ監査のテストも扱います。Vitest の設定と、すぐにコピーして使える 9 種類のテストテンプレートを提供します。これは React スキル(react-19、react-state、react-forms)に重ねて使うテスト手法のスキルです。各 API 自体ではなく、それらを使用するコンポーネントのテスト方法を扱います。

React Testing Library

ユーザーの操作に沿って React コンポーネントをテストします。

エージェントのワークフロー(必須)

実装に着手する前に、各 name を指定した Agent 呼び出しを 1 回ずつ行い、3 つのエージェントを並行して起動してください。

  1. fuse-ai-pilot:explore-codebase - 既存のテストパターンを分析します
  2. fuse-ai-pilot:research-expert - Context7/Exa を使って Testing Library の最新ドキュメントを確認します
  3. mcp__context7__query-docs - userEvent と waitFor のパターンを確認します

実装後、検証のために fuse-ai-pilot:sniper を実行してください。


概要

使用する場面
  • React コンポーネントの動作をテストする
  • ユーザー操作を検証する
  • アクセシビリティ要件への準拠を確認する
  • MSW で API 呼び出しをモックする
  • カスタムフックをテストする
  • React 19 の機能(useActionState、use())をテストする
React Testing Library を使う理由
特徴メリット
ユーザー中心ユーザーに見えるものをテストします
アクセシブルなクエリアクセシビリティに配慮したマークアップを促します
実装の詳細に依存しないリファクタリングに強くなります
Vitest との統合Jest より 10~20 倍高速です

重要なルール

  1. まずロールで検索する - getByRole が最もアクセシブルです
  2. fireEvent ではなく userEvent を使う - 現実的な操作を再現します
  3. 非同期処理には waitFor を使う - setTimeout は使用しません
  4. API のモックには MSW を使う - fetch はモックしません
  5. 実装ではなく動作をテストする - 内部状態はテストしません

リファレンスガイド

概念
トピックリファレンス
セットアップとインストールreferences/installation.md
クエリの優先順位references/queries.md
ユーザー操作references/user-events.md
非同期パターンreferences/async-testing.md
API のモックreferences/msw-setup.md
React 19 のフックreferences/react-19-hooks.md
アクセシビリティreferences/accessibility-testing.md
カスタムフックreferences/hooks-testing.md
Vitest の設定references/vitest-config.md
モックのパターンreferences/mocking-patterns.md
テンプレート
テンプレート用途
templates/basic-setup.mdVitest、RTL、MSW の設定
templates/component-basic.mdシンプルなコンポーネントのテスト
templates/component-async.mdローディング/エラー/成功
templates/form-testing.mdフォームと useActionState
templates/hook-basic.mdカスタムフックのテスト
templates/api-integration.mdMSW を使った統合テスト
templates/suspense-testing.mdSuspense と use()
templates/error-boundary.mdエラー境界のテスト
templates/accessibility-audit.mdaxe-core によるアクセシビリティ監査

禁止パターン

パターン理由代替手段
fireEvent現実的ではありませんuserEvent
setTimeout不安定になりますwaitFor、findBy
最初に getByTestId を使うアクセシビリティに配慮していませんgetByRole
fetch を直接モックする保守が困難ですMSW
空の waitForアサーションがありませんexpect() を追加する

クイックスタート

インストール
npm install -D vitest @testing-library/react \
  @testing-library/user-event @testing-library/jest-dom \
  jsdom msw

→ 完全な設定については templates/basic-setup.md を参照してください

基本的なテスト
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'

test('button click works', async () => {
  const user = userEvent.setup()
  render(<Button onClick={fn}>Click</Button>)

  await user.click(screen.getByRole('button'))

  expect(fn).toHaveBeenCalled()
})

→ その他の例については templates/component-basic.md を参照してください


ベストプラクティス

クエリの優先順位
  1. getByRole - ボタン、見出し、入力欄
  2. getByLabelText - フォームの入力欄
  3. getByText - 静的テキスト
  4. getByTestId - 最終手段
Async Pattern
// Preferred: findBy
await screen.findByText('Loaded')

// Alternative: waitFor
await waitFor(() => expect(...).toBeInTheDocument())

→ See templates/component-async.md

userEvent Setup
const user = userEvent.setup()
await user.click(button)
await user.type(input, 'text')

→ See references/user-events.md

コメント