testing-patterns
Jestのテストパターン、ファクトリ関数、モック戦略、およびTDDワークフローに関するスキル。ユニットテストの作成、テストファクトリの構築、またはTDDのレッド・グリーン・リファクタリングサイクルを実践する際に活用してください。
description の原文を見る
Jest testing patterns, factory functions, mocking strategies, and TDD workflow. Use when writing unit tests, creating test factories, or following TDD red-green-refactor cycle.
SKILL.md 本文
テストパターンとユーティリティ
テスト哲学
テスト駆動開発 (TDD):
- まず失敗するテストを書く
- 最小限のコードを実装してテストを通す
- 緑になった後にリファクタリング
- 失敗するテストなしで本番コードを書かない
振る舞いベースのテスト:
- 実装ではなく振る舞いをテストする
- パブリック API とビジネス要件に焦点を当てる
- 実装の詳細をテストしない
- 振る舞いを説明する説明的なテスト名を使用する
Factory パターン:
getMockX(overrides?: Partial<X>)関数を作成する- 妥当なデフォルト値を提供する
- 特定のプロパティをオーバーライド可能にする
- テストを DRY で保守性の高い状態に保つ
テストユーティリティ
カスタムレンダー関数
必要なプロバイダーでコンポーネントをラップするカスタムレンダーを作成します:
// src/utils/testUtils.tsx
import { render } from '@testing-library/react-native';
import { ThemeProvider } from './theme';
export const renderWithTheme = (ui: React.ReactElement) => {
return render(
<ThemeProvider>{ui}</ThemeProvider>
);
};
使用方法:
import { renderWithTheme } from 'utils/testUtils';
import { screen } from '@testing-library/react-native';
it('should render component', () => {
renderWithTheme(<MyComponent />);
expect(screen.getByText('Hello')).toBeTruthy();
});
Factory パターン
コンポーネントプロップス Factory
import { ComponentProps } from 'react';
const getMockMyComponentProps = (
overrides?: Partial<ComponentProps<typeof MyComponent>>
) => {
return {
title: 'Default Title',
count: 0,
onPress: jest.fn(),
isLoading: false,
...overrides,
};
};
// テストでの使用
it('should render with custom title', () => {
const props = getMockMyComponentProps({ title: 'Custom Title' });
renderWithTheme(<MyComponent {...props} />);
expect(screen.getByText('Custom Title')).toBeTruthy();
});
データ Factory
interface User {
id: string;
name: string;
email: string;
role: 'admin' | 'user';
}
const getMockUser = (overrides?: Partial<User>): User => {
return {
id: '123',
name: 'John Doe',
email: 'john@example.com',
role: 'user',
...overrides,
};
};
// 使用例
it('should display admin badge for admin users', () => {
const user = getMockUser({ role: 'admin' });
renderWithTheme(<UserCard user={user} />);
expect(screen.getByText('Admin')).toBeTruthy();
});
モッキングパターン
モジュールのモッキング
// モジュール全体をモック
jest.mock('utils/analytics');
// ファクトリ関数でモック
jest.mock('utils/analytics', () => ({
Analytics: {
logEvent: jest.fn(),
},
}));
// テストでモックにアクセス
const mockLogEvent = jest.requireMock('utils/analytics').Analytics.logEvent;
GraphQL フックのモッキング
jest.mock('./GetItems.generated', () => ({
useGetItemsQuery: jest.fn(),
}));
const mockUseGetItemsQuery = jest.requireMock(
'./GetItems.generated'
).useGetItemsQuery as jest.Mock;
// テストで
mockUseGetItemsQuery.mockReturnValue({
data: { items: [] },
loading: false,
error: undefined,
});
テスト構造
describe('ComponentName', () => {
beforeEach(() => {
jest.clearAllMocks();
});
describe('Rendering', () => {
it('should render component with default props', () => {});
it('should render loading state when loading', () => {});
});
describe('User interactions', () => {
it('should call onPress when button is clicked', async () => {});
});
describe('Edge cases', () => {
it('should handle empty data gracefully', () => {});
});
});
クエリパターン
// 要素が存在する必要がある
expect(screen.getByText('Hello')).toBeTruthy();
// 要素は存在しないはず
expect(screen.queryByText('Goodbye')).toBeNull();
// 要素は非同期に表示される
await waitFor(() => {
expect(screen.findByText('Loaded')).toBeTruthy();
});
ユーザーインタラクションパターン
import { fireEvent, screen } from '@testing-library/react-native';
it('should submit form on button click', async () => {
const onSubmit = jest.fn();
renderWithTheme(<LoginForm onSubmit={onSubmit} />);
fireEvent.changeText(screen.getByLabelText('Email'), 'user@example.com');
fireEvent.changeText(screen.getByLabelText('Password'), 'password123');
fireEvent.press(screen.getByTestId('login-button'));
await waitFor(() => {
expect(onSubmit).toHaveBeenCalled();
});
});
避けるべきアンチパターン
モック動作ではなく実際の動作をテストする
// 悪い - モックをテストしている
expect(mockFetchData).toHaveBeenCalled();
// 良い - 実際の動作をテストしている
expect(screen.getByText('John Doe')).toBeTruthy();
ファクトリを使用しない
// 悪い - 重複した一貫性のないテストデータ
it('test 1', () => {
const user = { id: '1', name: 'John', email: 'john@test.com', role: 'user' };
});
it('test 2', () => {
const user = { id: '2', name: 'Jane', email: 'jane@test.com' }; // role がない!
});
// 良い - 再利用可能なファクトリ
const user = getMockUser({ name: 'Custom Name' });
ベストプラクティス
- 常にファクトリ関数を使用する - プロップとデータ用
- 実装ではなく振る舞いをテストする
- 説明的なテスト名を使用する
- describe ブロックで整理する
- テスト間でモックをクリアする
- テストに集中する - テストあたり 1 つの振る舞い
テストの実行
# すべてのテストを実行
npm test
# カバレッジ付きで実行
npm run test:coverage
# 特定のファイルを実行
npm test ComponentName.test.tsx
他のスキルとの統合
- react-ui-patterns: すべての UI 状態をテスト (ローディング、エラー、空、成功)
- systematic-debugging: バグ修正前に問題を再現するテストを作成
使用時期
このスキルは、概要に記載されたワークフローまたはアクションを実行するときに適用できます。
制限事項
- このスキルは、上記で説明されたスコープと明確に一致するタスクの場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家のレビューの代わりとは見なさないでください。
- 必要な入力、権限、安全境界、または成功基準が不足している場合は停止して明確化を求めてください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- sickn33
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/sickn33/antigravity-awesome-skills / ライセンス: MIT
関連スキル
newsblur-cli
ターミナルからNewsBlurを管理できます。フィードの閲覧、ストーリーの検索、記事の保存・共有、インテリジェンス分類器の学習、新しいフィードの発見、ワークフローの自動化がNewsBlur CLIで実現します。ユーザーがNewsBlurアカウントを操作したい場合、フィードの確認、購読管理、またはニュース読み込みに関するスクリプト構築時に活用してください。
caveman-compress
自然言語のメモリファイル(CLAUDE.md、todos、preferences)を「原始人形式」に圧縮し、入力トークンを削減します。技術的な内容、コード、URL、構造はすべて保持したまま圧縮します。圧縮版が元のファイルを上書きし、人間が読める形のバックアップはFILE.original.mdとして保存されます。トリガー:/caveman-compress FILEPATH または「compress memory file」
find-skills
日本語の意図から Agent Skills を発見する。「楽天SEOのスキル探して」「PDFを処理したい」「データ分析を自動化したい」などの日本語リクエストに対応。Claude Code (CLI)、Codex、Gemini CLI、claude.ai (Web) いずれでも動作。日本最大の Agent Skills データベース「Agent Skills by ALSEL」(11,000件超、全件日本語化、ダウンロード可能スキル8,600件超) から、ユーザーの意図に合うスキルを推薦・インストール案内する。
planning-and-task-breakdown
仕事を順序立てたタスクに分割します。仕様書や要件が明確にあり、実装可能なタスクに分解する必要がある場合に利用してください。タスクが大きすぎて着手しづらい場合、スコープを見積もる必要がある場合、または並列で作業を進められる場合に活用できます。
docx
このスキルは、ユーザーがWord文書(.docxファイル)を作成、読み込み、編集、操作したいときに使用します。以下の場合に実行してください:「Word文書」「.docx」などの記述、または目次・見出し・ページ番号・レターヘッドなどのフォーマットを含む専門的な文書の作成リクエスト。また、.docxファイルのコンテンツ抽出・再編成、文書への画像挿入・置換、Word形式での検索置換、変更履歴やコメント機能の使用、コンテンツを整形したWord文書への変換の場合も対象です。ユーザーが「レポート」「メモ」「手紙」「テンプレート」などの成果物をWord形式または.docxファイルで求める場合はこのスキルを使用してください。PDF、スプレッドシート、Google Docs、文書作成と無関係なコーディングタスクには使用しないでください。
idea-refine
アイデアを反復的に改善します。構造化された発散的思考と収束的思考を通じて、アイデアを洗練させることができます。「idea-refine」または「ideate」を使用してトリガーします。