plugins/elixir-phoenix/skills/testing/SKILL.md
Elixir testing patterns — ExUnit, Mox, factories, LiveView test helpers. Use when working on *_test.exs, test/support/, factory files, or fixing test failures.
npx skillsauth add oliver-kriska/claude-elixir-phoenix testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Ash projects: Use
DataCasewithAsh.Testhelpers; test actions via domain code interfaces, not directRepocalls. Seeash-frameworkskill.
Quick reference for Elixir testing patterns.
async: true unless tests modify global state@callback behaviourbuild/2 in factories; insert/2 only when DB neededassert_receive with timeout for async operationsvalidate_required in the schema changeset. Missing fields cause cascading test failures| Testing | Use |
|---------|-----|
| Controller/API | use MyAppWeb.ConnCase |
| Context/Schema | use MyApp.DataCase |
| LiveView | use MyAppWeb.ConnCase + import Phoenix.LiveViewTest |
| Pure logic | use ExUnit.Case, async: true |
Application.put_envbuild() by default for speedinsert() only when you need DB ID, constraints, or persisted associations# 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
| Wrong | Right |
|-------|-------|
| Process.sleep(100) | assert_receive {:done, _}, 5000 |
| insert(:user) in factory | build(:user) in factory |
| async: true with set_mox_global() | async: false |
| Mock internal modules | Test through public API |
For detailed patterns, see:
${CLAUDE_SKILL_DIR}/references/exunit-patterns.md - Setup, assertions, tags${CLAUDE_SKILL_DIR}/references/mox-patterns.md - Behaviours, expect/stub, async${CLAUDE_SKILL_DIR}/references/liveview-testing.md - Forms, async, uploads${CLAUDE_SKILL_DIR}/references/factory-patterns.md - ExMachina, sequences, traitstools
Scope or freeze which files Claude can edit during debugging, a refactor, or review. Use when edits should stay in specific dirs, or for a read-only investigate lock. Backed by a sentinel + PreToolUse hook.
development
Ash Framework — resources, actions, policies, aggregates, calculations, AshPhoenix.Form, LiveView, migrations. Use when generating resources via mix ash.codegen, editing changes, checks, types, validations, or domain code interfaces.
development
Reduce mix output noise (5-15% token savings) by installing rtk filters that compress mix test/credo/dialyzer/compile output before it reaches Claude. Use when long mix output floods context.
development
Narrow bare rescue in Elixir so real errors like KeyError and typos propagate instead of being swallowed. Use to audit rescues and refactor error handling.