Frontend Test Author
Overview
フロントエンドの単体・結合テストを最小構成で追加・修正し、CIで安定して通る状態にする。
Workflow
- •対象と責務を決める
- •UIコンポーネント:
frontend/src/tests/components/** - •画面/ドメイン:
frontend/src/tests/features/<domain>/**- •画面:
screens/ - •サービス(API):
services/
- •画面:
- •コアユースケース:
frontend/src/tests/core/usecases/** - •E2Eは
frontend/src/e2e/**(依頼がある場合のみ)
- •テスト基盤を確認する
- •
frontend/package.jsonにvitest/@testing-library/*/jsdomがあるか確認する - •
frontend/vitest.config.tsとfrontend/src/tests/setup.tsxがあるか確認する - •
@/エイリアスが有効か確認する
- •テスト実装の基本方針
- •
render/screen/userEventを使用する - •ラベルは正規表現で取得する(
/メールアドレス/など) - •非同期UIは
findByRole/waitForを使う - •パスワードの表示トグル等でラベルが衝突する場合は
getByLabelText(/パスワード/, { selector: 'input' })を使う - •ネイティブバリデーションで
submitが止まる場合はfireEvent.submit(form)を使う
- •レイヤ別のテストパターン
- •画面(App Router)
- •
next/navigationをvi.mockで差し替える - •
useRouter/useSearchParamsの戻り値を制御する
- •
- •サービス(API)
- •
apiClientのGET/POSTをvi.spyOnでモックする - •
ensureOk由来のApiErrorを検証する
- •
- •ユースケース
- •Repositoryインターフェースを
vi.fn()でモックする - •例外伝播の確認を最小限追加する
- •Repositoryインターフェースを
- •実行
- •
cd frontend && npm test - •CI用:
cd frontend && npm run test:ci
Minimal Examples
画面(App Router)
tsx
import { render, screen } from '@testing-library/react'
import { useRouter } from 'next/navigation'
import { vi } from 'vitest'
vi.mock('next/navigation', () => ({ useRouter: vi.fn() }))
サービス(API)
ts
import { apiClient } from '@/lib/api/client'
import { vi } from 'vitest'
vi.spyOn(apiClient, 'POST').mockResolvedValue({ data: { accessToken: 'token', user: {} } })