universal/testing/testing-anti-patterns/SKILL.md
Never test mock behavior. Never add test-only methods to production classes. Understand dependencies before mocking. Language-agnostic principles with TypeScript/Jest and Python/pytest examples.
npx skillsauth add bobmatnyc/claude-mpm-skills Testing Anti-PatternsInstall 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.
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.
Activate this skill when:
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
Asserting on mock elements instead of real behavior. Fix: Test real component or don't mock it. → core-anti-patterns.md
Methods in production classes only used by tests. Fix: Move to test utilities. → core-anti-patterns.md
Mocking without understanding dependencies/side effects. Fix: Understand first, mock minimally. → core-anti-patterns.md
Partial mocks missing fields downstream code needs. Fix: Mirror complete API structure. → completeness-anti-patterns.md
Implementation "complete" without tests. Fix: TDD - write test first. → completeness-anti-patterns.md
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<T>, incomplete objects
→ Python: Mock() with few attributes, missing nested fields
→ If yes: STOP - Mirror complete API structure
□ Did I write implementation before test?
→ If yes: STOP - Delete impl, write test first (TDD)
□ Is mock setup >50% of test code?
→ If yes: Consider integration test with real components
See: detection-guide.md for comprehensive red flags and warning signs.
Mocks are tools to isolate, not things to test.
Testing mock behavior indicates a problem. Fix: Test real behavior or question why mocking is necessary.
TDD prevents these patterns. Write test first → Watch fail → Minimal implementation → Pass → Refactor.
When using this skill, consider these complementary skills (if deployed in your skill bundle):
test-driven-development: Complete TDD workflow and red-green-refactor cycle
verification-before-completion: Definition of "done" and verification protocols
Note: All skills are independently deployable. This skill is fully functional without them.
STOP immediately when:
*-mock test IDs, expect(mock).toHaveBeenCalled()mock.assert_called(), mock.call_count without real behavior checksdestroy(), reset() only in *.test.ts_set_mock_*, _for_testing with "For testing only" docstrings@patch or vi.mock() "just to be safe"Partial<T>, missing nested objectsMock() for data objects, missing required fieldsWhen mocks become too complex: Consider integration tests with real components. Often simpler and more valuable.
Prerequisite: Test-Driven Development skill - TDD prevents anti-patterns (recommended for complete workflow) Complementary: Verification-Before-Completion skill - Tests = done (ensures proper testing discipline) Domain-specific: webapp-testing, backend-testing for framework patterns (see skill library if available)
development
Axum (Rust) web framework patterns for production APIs: routers/extractors, state, middleware, error handling, tracing, graceful shutdown, and testing
development
Optimize web performance using Core Web Vitals, modern patterns (View Transitions, Speculation Rules), and framework-specific techniques
development
Best practices for documenting APIs and code interfaces, eliminating redundant documentation guidance per agent.
development
Comprehensive API design patterns covering REST, GraphQL, gRPC, versioning, authentication, and modern API best practices