Testing Anti-Patterns
Overview
Tests must verify real behavior, not mock behavior. Mocks are a means to isolate, not the thing being tested.
Core principle:
Test what the code does, not what the mocks do.
Following strict TDD prevents these anti-patterns.
See the Test-Driven Development skill (available in the skill library) for the complete TDD workflow.
When to Use This Skill
Activate this skill when:
Writing or changing tests
- Verify tests cover real behavior
Adding mocks
- Ensure mocking is necessary and correct
Reviewing test failures
- Check if mock behavior is the issue
Tempted to add test-only methods
- STOP and reconsider
Tests feel overly complex
- Sign of over-mocking
The Iron Laws
1. NEVER test mock behavior
2. NEVER add test-only methods to production classes
3. NEVER mock without understanding dependencies
4. NEVER create incomplete mocks
5. NEVER treat tests as afterthought
Core Anti-Pattern Categories
1. Testing Mock Behavior
Asserting on mock elements instead of real behavior.
Fix:
Test real component or don't mock it.
→
core-anti-patterns.md
2. Test-Only Methods in Production
Methods in production classes only used by tests.
Fix:
Move to test utilities.
→
core-anti-patterns.md
3. Mocking Without Understanding
Mocking without understanding dependencies/side effects.
Fix:
Understand first, mock minimally.
→
core-anti-patterns.md
4. Incomplete Mocks
Partial mocks missing fields downstream code needs.
Fix:
Mirror complete API structure.
→
completeness-anti-patterns.md
5. Tests as Afterthought
Implementation "complete" without tests.
Fix:
TDD - write test first.
→
completeness-anti-patterns.md
Quick Detection Checklist
Run this checklist before committing any test:
Language-agnostic checks:
□ Am I asserting on mock behavior instead of real behavior?
→ TypeScript: testId='-mock', expect(mock).toHaveBeenCalled()
→ Python: mock.assert_called(), mock.call_count
→ If yes: STOP - Test real behavior or unmock
□ Does this method only exist for tests?
→ TypeScript: destroy(), reset(), clear() only in .test.ts
→ Python: set_mock, for_testing only in test.py
→ If yes: STOP - Move to test utilities
□ Do I fully understand what I'm mocking?
→ If no: STOP - Run with real impl first, then mock minimally
□ Is my mock missing fields the real API has?
→ TypeScript: Partial
testing anti-patterns
安装
npx skills add https://github.com/bobmatnyc/claude-mpm-skills --skill 'Testing Anti-Patterns'