mcpField
W
write-tests

write-tests

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

write-tests について

RSpecテストの作成、レビュー、整理に使うスキルです。振る舞いを重視した例や決定的なアサーションを用い、RED/GREENの検証を含むテスト先行の進め方を案内します。

主な機能

  1. 01RSpecのテスト先行ワークフロー
  2. 02スペック種別の選択ガイド
  3. 03振る舞いに基づくアサーション
  4. 04不安定なテストの予防指針
  5. 05RED/GREEN出力要件

活用シーン

  1. 01新しいアプリの振る舞いのテスト
  2. 02RSpecテストのレビューや整理
  3. 03サービスオブジェクトのスペック作成
  4. 04不安定なテストパターンの調査

インストール

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

$npx skills add https://github.com/igmarin/rails-agent-skills --skill write-tests

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

同梱ファイル

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

assets/
complete_example.md
examples.md
output_checklist.md
spec_templates.md
tdd_proof_checklist.md

詳細

テストを書く

このスキルは、RSpec テストの作成、レビュー、またはクリーンアップがタスクである場合に使用します。

クイックリファレンス

観点ルール
スペックの種類Model: ドメインロジック / 純粋なドメイン → ここから始める。Request: HTTP エンドポイント。Job: バックグラウンド処理。Service/PORO: クリーンな Ruby。System: レイヤーをまたぐ E2E ジャーニー(控えめに)
アサーション実装ではなく振る舞いをテストする
ファクトリ属性は最小限に。オプションには trait を使用。create よりも build/build_stubbed を優先
モック外部境界はクラスレベルでスタブする(例: allow(Client).to receive)。Active Record のモックは禁止
Service スペック必須: describe '.call' と subject(:result)(assets/output_checklist.md を参照)
let と let!デフォルトは let。アクションの前にオブジェクトが存在しなければならない場合のみ let! を使用
example 名現在形。should は使わない。and も使わない(assets/output_checklist.md を参照)

HARD-GATE

DO NOT write implementation code before a failing test exists.
Run bundle exec rspec and keep the real failure class and message.

コアプロセス

RSpec で新しい振る舞いを駆動する場合は、次の順序に従います。

  1. 失敗するスペックを書く — 意図する振る舞いを検証する最小のスペック種別を選びます(model > service > request > system)。上記の「スペックの種類」の行に示すとおりです。
  2. 実行して失敗メッセージを確認する — 具体的な RED の失敗クラス/メッセージを示します。これをプレースホルダーのテンプレートのままにしないでください。最終成果物に説明的な e.g. の失敗例を使わないでください。
  3. スペックをパスさせるための最小限のコードを実装する。
  4. リファクタリングする — スイートをグリーンに保ちながら、重複と命名をクリーンアップします。
  5. 検証する — コミットする前に、関連するスペックファイル全体を実行し、その後スイートを実行します。

出力形式と RED/GREEN の証明要件については、assets/tdd_proof_checklist.md を参照してください。

Service スペック(アンカーパターン)
RSpec.describe Invoices::MarkOverdue do
  describe '.call' do
    subject(:result) { described_class.call(invoice: invoice) }

    context 'when the invoice is overdue and unpaid' do
      let(:invoice) { create(:invoice, due_date: 2.days.ago, paid_at: nil) }
      it 'marks the invoice overdue' do
        expect { result }.to change { invoice.reload.overdue? }.from(false).to(true)
      end
    end
  end
end
1 つの example につき 1 つの振る舞い

it/specify の説明にある and は毎回分割してください — 例外はありません。

# BAD — two assertions; if the first fails, the second never runs
it 'returns 201 and creates the record' do; end

# GOOD — one observable outcome per example
it 'returns 201' do; end
it 'creates the record' do; end

フレーキーなテストと決定論的なアサーション

原因修正
時間依存のロジックfreeze_time / travel_to を使用。ショートカットとして過去の日付を設定しない
状態の漏洩各 example が自身の状態をセットアップする。before(:all) を避ける
非同期ジョブqueue_adapter = :test + have_enqueued_job を使用。副作用を命令的にアサートしない
外部 HTTPWebMock / VCR を使用。CI で実際のネットワークを許可しない
DB 状態の漏洩トランザクショナルフィクスチャまたは DatabaseCleaner を使用。コンテキスト間で let! を共有しない
競合状態明示的な Capybara の待機を使用。sleep を避ける
不正確なアサーション最終状態よりも change.from().to() を使用。be_truthy/be_falsey よりも正確な値を使用。ルール 16 を参照

拡張リソース(プログレッシブディスクロージャー)

これらのファイルは、その特定の内容が必要な場合にのみ読み込んでください。

  • assets/complete_example.md — 高スコアの answer.md の完全なステップバイステップの例。プラン、スペック、現実的な Observed RED/GREEN 出力、検証テーブルを示します。
  • assets/examples.md — Service スペック、shared examples、ファクトリ設計のコード例について。
  • assets/spec_templates.md — さまざまな種類のスペックの標準テンプレート。
  • assets/tdd_proof_checklist.md — タスクが新しい振る舞いを含む場合に使用します。RED/GREEN の証明形式、出力フォーマットのルール、GREEN プログレスバーの要件を定義します。
  • assets/output_checklist.md — RSpec 出力の構造、規約、セルフ監査のための完全な 18 項目のチェックリスト。すべての出力スタイルルール(スペック構造、ファイルパスのミラーリング、frozen_string_literal、subject(:result)、TDD 証明形式)も定義します。

出力スタイル

assets/tdd_proof_checklist.md と assets/output_checklist.md に従ってください。実際の RED/GREEN コマンド出力を示してください。1 つの example につき 1 つの振る舞いとします。

統合

スキルチェーンするタイミング
plan-tests最初のスライスの選択が自明でない場合
test-serviceスライスがサービスの .call である場合
tddPR までの完全な機能ループ

コメント