Skip to main content
skill CX Codex

testing-anti-patterns — Claude Code skill: tests and install

A skill for spotting tests that verify mock behavior, add test-only production methods, or use incomplete mocks.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add bobmatnyc/claude-mpm-skills --skill testing-anti-patterns -a claude-code
Open on GitHub

What testing-anti-patterns does

testing-anti-patterns guides test writing and review around a simple rule: verify real behavior, not the behavior of a mock. It flags assertions aimed at mock calls, methods added to production classes only for tests, and mocking done before the dependencies and side effects are understood.

The material covers five problem groups: testing mock behavior, test-only production methods, uninformed mocking, incomplete mocks, and tests treated as an afterthought. It includes TypeScript and Jest examples, Python and pytest examples, plus a checklist for reviewing a test before commit.

When mock setup takes more than half of a test, the skill points toward considering an integration test with real components. It is disabled for direct user invocation and does not run automatically.

What it helps with

  • check whether a test verifies real behavior
  • find production methods that exist only for tests
  • spot mocks missing fields used downstream
  • trace dependencies before adding a mock
  • move testing earlier into a TDD workflow

Example prompts for the agent

  • Review this test and tell me whether it checks real behavior or only mock behavior.
  • Find test-only methods in the production classes changed in this branch and suggest test utilities instead.
  • Inspect the mocks in src/service.test.ts; compare them with the dependency API and list missing fields.

How to install testing-anti-patterns

1Skills CLI (Vercel)

npx skills add bobmatnyc/claude-mpm-skills --skill testing-anti-patterns -a claude-code

2Manually: put the files in place

~/.claude/skills/testing-anti-patterns/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/testing-anti-patterns/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about testing-anti-patterns

How do I install testing-anti-patterns in Claude Code?

Run npx skills add bobmatnyc/claude-mpm-skills --skill testing-anti-patterns -a claude-code, then run the same command again. The skill is placed at ~/.claude/skills/testing-anti-patterns/SKILL.md.

What does testing-anti-patterns do?

It helps identify tests that assert mock behavior, add test-only methods to production code, or create incomplete mocks. It also pushes the agent to understand dependencies before mocking and to write the test before implementation.

Does testing-anti-patterns support Jest and pytest?

Yes. The skill includes examples for TypeScript with Jest and Python with pytest, while keeping its core principles language-agnostic.

Source text

SKILL.md · MIT
---
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:
  - testing
  - typescript
  - javascript
  - python
  - pytest
  - jest
  - mocking
  - tdd
  - anti-patterns
progressive_disclosure:
  entry_point:
    summary: "Avoid testing mocks, test-only production methods, and incomplete mocking. Test real behavior, not mock behavior. Covers TypeScript/Jest and Python/pytest."
    when_to_use: "When writing tests, adding mocks, reviewing test failures, or tempted to add test-only methods to production code."
    quick_start: "1. Ask: 'Am I testing real behavior?' 2. Check: 'Is this method only for tests?' 3. Verify: 'Do I understand what I'm mocking?' 4. Confirm: 'Is my mock complete?' 5. Apply: TDD prevents these patterns"
  references:
    - core-anti-patterns.md
    - completeness-anti-patterns.md
    - detection-guide.md
    - tdd-connection.md
    - python-examples.md
related_skills:
  - toolchains-typescript-testing-jest
  - toolchains-typescript-testing-vitest
  - toolchains-python-testing-pytest
  - universal-debugging-systematic-debugging
  - universal-debugging-verification-before-completion
---

# 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](references/core-anti-patterns.md#anti-pattern-1-testing-mock-behavior)

### 2. Test-Only Methods in Production
Methods in production classes only used by tests. **Fix:** Move to test utilities.
**→** [core-anti-patterns.md](references/core-anti-patterns.md#anti-pattern-2-test-only-methods-in-production)

### 3. Mocking Without Understanding
Mocking without understanding dependencies/side effects. **Fix:** Understand first, mock minimally.
**→** [core-anti-patterns.md](references/core-anti-patterns.md#anti-pattern-3-mocking-without-understanding)

### 4. Incomplete Mocks
Partial mocks missing fields downstream code needs. **Fix:** Mirror complete API structure.
**→** [completeness-anti-patterns.md](references/completeness-anti-patterns.md#anti-pattern-4-incomplete-mocks)

### 5. Tests as Afterthought
Implementation "complete" without tests. **Fix:** TDD - write test first.
**→** [completeness-anti-patterns.md](references/completeness-anti-patterns.md#anti-pattern-5-tests-as-afterthought)

## 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<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](references/detection-guide.md) for comprehensive red flags and warning signs.

## The Bottom Line

**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.

## Navigation

### Detailed Anti-Pattern Analysis
- **[Core Anti-Patterns](references/core-anti-patterns.md)** - Patterns 1-3: Mock behavior, test-only methods, uninformed mocking
- **[Completeness Anti-Patterns](references/completeness-anti-patterns.md)** - Patterns 4-5: Incomplete mocks, tests as afterthought

### Detection & Prevention
- **[Detection Guide](references/detection-guide.md)** - Red flags, warning signs, gate functions
- **[TDD Connection](references/tdd-connection.md)** - How test-driven development prevents these patterns

### Language-Specific Examples
- **[Python Examples](references/python-examples.md)** - Complete Python/pytest guide covering all 5 anti-patterns with unittest.mock and pytest-mock patterns, fixture best practices, and pytest-specific detection. Load when working with Python tests.

### Related Skills

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
  - *Use case*: Implementing TDD discipline to prevent anti-patterns
  - *Integration*: TDD workflow prevents most anti-patterns by design
  - *Status*: Recommended - basic anti-patterns covered in this skill

- **verification-before-completion**: Definition of "done" and verification protocols
  - *Use case*: Ensuring tests are part of completion criteria
  - *Integration*: Tests must pass before work is considered complete
  - *Status*: Recommended - testing mindset reinforcement

*Note: All skills are independently deployable. This skill is fully functional without them.*

## Key Reminders

1. **Mocks isolate, don't prove** - Test real code, not mocks
2. **Production ignores tests** - No test-only methods
3. **Understand before mocking** - Know dependencies and side effects
4. **Complete mocks only** - Mirror full API structure
5. **Tests ARE implementation** - Not optional afterthought

## Red Flags - STOP

**STOP immediately when:**
- **Testing mock behavior**
  - TypeScript: Asserting on `*-mock` test IDs, `expect(mock).toHaveBeenCalled()`
  - Python: `mock.assert_called()`, `mock.call_count` without real behavior checks
- **Adding test-only methods**
  - TypeScript: `destroy()`, `reset()` only in `*.test.ts`
  - Python: `_set_mock_*`, `_for_testing` with "For testing only" docstrings
- **Mocking without understanding**
  - Adding `@patch` or `vi.mock()` "just to be safe"
  - Creating mocks from memory instead of API docs
- **Incomplete mocks**
  - TypeScript: `Partial<T>`, missing nested objects
  - Python: `Mock()` for data objects, missing required fields
- **Tests as afterthought**
  - Saying "tests can wait" or "ready for testing"
  - Implementation commits before test commits

**When mocks become too complex:** Consider integration tests with real components. Often simpler and more valuable.

## Integration with Other Skills

**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)

© bobmatnyc · MIT · bobmatnyc/claude-mpm-skills

Similar skills

Everything for Testing and QA →

From the same set65

vue A Vue 3 skill for your coding agent: Composition API, reactivity, single-file components, Vue Router, Pinia, TypeScript and Vite. Useful when the agent writes Vue frontend code. CX Codex +1 381installs api-documentation A set of rules that tells the agent how to write docstrings, JSDoc, Godoc and endpoint descriptions. Useful when several agents each carry their own copy of the same guidance. CX Codex +1 379installs software-patterns Compares tradeoffs between architectural patterns and points to the one that fits your problem: coupling, resilience, service boundaries. Useful when code resists testing. CX Codex +1 373installs nextjs-v16 A skill that walks a project through the Next.js 16 migration: async request APIs, opt-in caching with "use cache", Turbopack. Useful when upgrading an existing app. CX Codex +1 371installs vercel-deployments-builds Walks through the Vercel deployment lifecycle: builds, previews, release phases and rollback. Useful when you configure build output or control releases. CX Codex +1 368installs stacked-prs A skill that walks the agent through building stacks of dependent pull requests, where each branch grows from the previous one instead of main. Useful when a large feature is split into phases. CX Codex +1 362installs better-auth-core A skill for wiring Better Auth into TypeScript apps: the instance, server handlers, client, and sessions. Useful when you need auth running without digging through docs. CX Codex +1 358installs reporting-pipelines A skill that fixes one pattern for report exports: collect data, normalize it, write CSV/JSON/Markdown with timestamped names into reports/. CX Codex +1 354installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor