test-doubles-mocking について
test-doubles-mockingは、協力オブジェクトを分離して相互作用を検証するSymfony向けテストスキルです。dummy、stub、mock、spy、fakeの選び方と使い方を案内し、過剰なモック化を避けます。
主な機能
- 01テスト目的に応じたテストダブルの選択
- 02PHPUnitでのstubとmockの作成
- 03重要な呼び出しやメッセージの検証
- 04戻り値、例外、コールバックの設定
- 05インメモリリポジトリfakeの作成
活用シーン
- 01外部サービスに依存するコードのテスト
- 02永続化やメッセージ送信の検証
- 03インメモリリポジトリ実装の用意
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill test-doubles-mockingインストール後、Claude Code で/test-doubles-mockingを入力して読み込まれたか確認します。
同梱ファイルreference.md
詳細
テストダブルによるモック(Symfony)
使用する場面
- テスト対象のクラスが、決済ゲートウェイやメッセージバスなど、処理が遅い、外部に依存する、または非決定的なコラボレーターに依存している場合。
persist()やflush()の呼び出し、またはメッセージのディスパッチなど、インタラクションを検証する必要がある場合。- リポジトリのインターフェースを実装するインメモリのフェイクが必要な場合。
- ダミー、スタブ、モック、スパイ、フェイクのどれを選ぶか判断する場合。
デフォルトのワークフロー
- 必要に応じてダブルを選びます。値を与えるにはスタブ、呼び出しを検証するにはモック、簡易版として動作する実装にはフェイクを使います。
$this->createMock(Interface::class)で作成し、->method('charge')->willReturn(...)でスタブを設定します。- インタラクションが重要な場合にのみ検証します。
expects($this->once())->with(...)を使うか、$this->callback()でディスパッチされたメッセージを調べます。 willReturnOnConsecutiveCalls()、willThrowException()、またはwillReturnCallback()で動作を設定します。- リポジトリには、インターフェースを実装する
InMemoryフェイクを作成します。 - プロジェクトがすでに Prophecy に依存している場合に限り、
ProphecyTraitとprophesize()、reveal()を使用します。
ガードレール
- テスト対象のクラスをモックしてはいけません。部分モック(
onlyMethods())は最後の手段です。 - 具象クラスではなく、インターフェースをモックします。
- モックよりスタブを優先し、テストごとにモックのアサーションは1つにします。
- 過剰にモックしてはいけません。データベースにアクセスする動作は、実際のリポジトリを使った機能テストで検証します。
段階的な情報開示
- 実行時の方針とリスク管理には、このファイルを使用します。
- 実装の詳細が必要な場合は、リファレンスを開きます。
出力要件
- 各コラボレーターに選んだダブルの種類と、その理由。
- 重要なものに限定した、検証対象のインタラクション。
- 追加したフェイクがあれば、
tests/Fakeの下に配置します。
リファレンス
reference.md
コメント
Markdown 対応