brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
testing-anti-patternsNever 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.
Independent GitHub snapshot · Automated classification · Original documentation governs
name: testing-anti-patterns description: 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. user-invocable: false disable-model-invocation: true when_to_use: when writing or changing tests, adding mocks, or tempted to add test-only methods to production code version: 3.0.0 tags:
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)