mcpField
T
testing

testing

github.com/oliver-kriskaテスト・品質57152 回インストール1 週間前に更新
リポジトリ

testing について

testing は Elixir プロジェクト向けのテスト早見スキルで、テストケースの選択、非同期処理、データベース分離、モック、ファクトリーを扱います。ExUnit、Mox、LiveView の実践的な規則とパターンをまとめています。

主な機能

  1. 01テスト種別に応じたケース選択
  2. 02非同期処理と Sandbox の指針
  3. 03モック利用範囲の明確化
  4. 04build と insert の使い分け
  5. 05ExUnit、Mox、LiveView のパターン参照

活用シーン

  1. 01コントローラーやコンテキストのテスト設定
  2. 02LiveView の動作テスト
  3. 03sleep を使わない非同期メッセージ処理
  4. 04ファクトリーでレコードを永続化するか判断

インストール

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

$npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix --skill testing

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

同梱ファイル

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

references/
exunit-patterns.md
factory-patterns.md
liveview-testing.md
mox-patterns.md

詳細

Elixir テストリファレンス

Ash プロジェクト:DataCase と Ash.Test ヘルパーを使用し、アクションは Repo を直接呼び出すのではなく、ドメインのコードインターフェースを介してテストしてください。ash-framework スキルを参照してください。

Elixir のテストパターンのクイックリファレンスです。

鉄則 — 決して破らないでください

  1. デフォルトは非同期 — テストがグローバル状態を変更する場合を除き、async: true を使用します
  2. サンドボックスによる分離 — すべてのデータベーステストで Ecto.Adapters.SQL.Sandbox を使用します
  3. 境界でのみモックする — データベース、内部モジュール、標準ライブラリは決してモックしません
  4. コントラクトとしてのビヘイビアー — すべてのモックは、定義済みの @callback ビヘイビアーを実装する必要があります
  5. デフォルトは build — ファクトリーでは build/2 を使用し、DB が必要な場合にのみ insert/2 を使用します
  6. Process.sleep は禁止 — 非同期操作にはタイムアウト付きの assert_receive を使用します
  7. VERIFY_ON_EXIT! — Mox のテストセットアップでは必ず呼び出します
  8. ファクトリーにはスキーマの必須フィールドを含める — ファクトリー定義には、スキーマの changeset で validate_required が指定されたすべてのフィールドを含める必要があります。フィールドが不足すると、テストで連鎖的な失敗が発生します

すぐに確認できる判断基準

どのテストケースを使うか?
テスト対象使用するもの
コントローラー/APIuse MyAppWeb.ConnCase
コンテキスト/スキーマuse MyApp.DataCase
LiveViewuse MyAppWeb.ConnCase + import Phoenix.LiveViewTest
純粋なロジックuse ExUnit.Case, async: true
async: true を使うタイミングは?
  • ✅ 純粋関数、共有状態なし
  • ✅ Sandbox を使うデータベーステスト(PostgreSQL)
  • ❌ Application.put_env を変更するテスト
  • ❌ Mox のグローバルモードを使うテスト
モックするかどうか?
  • ✅ モックする:外部 API、メールサービス、ファイルストレージ
  • ❌ モックしない:データベース、内部モジュール、標準ライブラリ
build() と insert() のどちらを使うか?
  • 速度を優先し、デフォルトでは build() を使用します
  • DB ID、制約、または永続化された関連データが必要な場合にのみ insert() を使用します

よく使うパターン

# Setup chain
setup [:create_user, :authenticate]

# Pattern matching assertion
assert {:ok, %User{name: name}} = create_user(attrs)

# Async message assertion
assert_receive {:user_created, _}, 5000

# Mox setup
setup :verify_on_exit!
expect(MockAPI, :call, fn _ -> {:ok, "data"} end)

# LiveView async
html = render_async(view)  # MUST call for assign_async

よくあるアンチパターン

誤り正しい方法
Process.sleep(100)assert_receive {:done, _}, 5000
ファクトリー内の insert(:user)ファクトリー内の build(:user)
set_mox_global() と async: true の併用async: false
内部モジュールをモックする公開 API を通じてテストする

リファレンス

詳しいパターンについては、以下を参照してください。

  • ${CLAUDE_SKILL_DIR}/references/exunit-patterns.md - セットアップ、アサーション、タグ
  • ${CLAUDE_SKILL_DIR}/references/mox-patterns.md - ビヘイビアー、expect/stub、非同期
  • ${CLAUDE_SKILL_DIR}/references/liveview-testing.md - フォーム、非同期、アップロード
  • ${CLAUDE_SKILL_DIR}/references/factory-patterns.md - ExMachina、シーケンス、特性

コメント