Agent skill

Python Test Doubles

by macalbert in macalbert/envilder

Test doubles with unittest.mock (Mock, AsyncMock, patch) and Mother pattern.

MITAuto-check passedTesting & QA

Install Python Test Doubles

skills CLI
$ npx skills add macalbert/envilder --skill python-test-doubles -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install macalbert/envilder python-test-doubles --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/macalbert/envilder.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/python-test-doubles .claude/skills/python-test-doubles && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
python-test-doubles
GitHub stars
138
Token cost
~1.4k tokens
SKILL.md length
251 words
Files
1
Skills in repo
30
Repo updated
First seen
Licence
MIT

At a glance

Test doubles with unittest.mock (Mock, AsyncMock, patch) and Mother pattern.

  • Works in 5 steps: Mock: Mock / AsyncMock → Stub: return_value / side_effect → Spy: wraps → …
  • Creating test data
  • SKILL.md covers Test Doubles Types, Verification Patterns, Pytest Fixtures as Factories and Mother Pattern, plus 1 more section
  • Needs API_KEY

What it does

Python Test Doubles is an agent skill from macalbert/envilder. Test doubles with unittest.mock (Mock, AsyncMock, patch) and Mother pattern. Use when creating test data, mocking dependencies, or setting up fixtures in Python tests.

Its SKILL.md is about 1.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering Unit testing and Test data and fixtures. It works with Python. The repository describes itself as: One secret mapping for local dev, CI/CD, and runtime. Envilder resolves cloud secrets from your own vaults without SaaS middlemen, duplicated config, or .env drift. The licence is MIT.

When your agent uses it

  • Creating test data
  • Mocking dependencies
  • Setting up fixtures in Python tests

Example prompts

  • “/python-test-doubles”

Requirements

  • Python 3
  • A credential in API_KEY

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Mock: Mock / AsyncMock
  2. Stub: return_value / side_effect
  3. Spy: wraps
  4. Module Patch: patch / patch.object
  5. Error Simulation: side_effect with Exception

What it can do on your machine

Read from SKILL.md and the folder at commit b6a0327. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Python Test Doubles loads about 1.4k tokens when it runs. Until then it costs about 47 tokens; SKILL.md has 251 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~47
When it runs · the whole SKILL.md, loaded when a task matches
~1.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from macalbert/envilder at commit b6a0327, republished under its MIT licence (© macalbert). 251 words, ~1,444 tokens.

Download SKILL.mdSave it as .claude/skills/python-test-doubles/SKILL.md (or your agent's skills folder).
name
python-test-doubles
description
Test doubles with unittest.mock (Mock, AsyncMock, patch) and Mother pattern. Use when creating test data, mocking dependencies, or setting up fixtures in Python tests.

Test Doubles (Python)

This skill defines how to use test doubles in Python (unittest.mock + pytest).


Test Doubles Types

1. Mock: Mock / AsyncMock

Use Mock and AsyncMock to create mock objects for protocol interfaces.

Purpose: Replace real dependencies with controllable test doubles.

python
from unittest.mock import Mock, AsyncMock


@pytest.fixture()
def secret_provider() -> Mock:
    provider = Mock(spec=ISecretProvider)
    provider.get_secret = Mock(return_value=None)
    return provider


@pytest.fixture()
def async_provider() -> AsyncMock:
    provider = AsyncMock(spec=ISecretProvider)
    provider.get_secret = AsyncMock(return_value=None)
    return provider

MANDATORY: Always use spec=InterfaceClass to catch typos at test time.

2. Stub: return_value / side_effect

Use return_value or side_effect to configure stubs.

Purpose: Predefined responses without caring about call verification.

python
# Simple stub
provider.get_secret.return_value = "secret-value"

# Sequential returns
provider.get_secret.side_effect = ["first", "second", None]

# Conditional stub
def resolve_secret(name: str) -> str | None:
    secrets = {"/app/db": "postgres://...", "/app/key": "abc123"}
    return secrets.get(name)

provider.get_secret.side_effect = resolve_secret
3. Spy: wraps

Use wraps to observe calls on real objects without replacing behavior.

Purpose: Verify interactions while preserving real implementation.

python
real_parser = MapFileParser()
spy_parser = Mock(wraps=real_parser)

sut = EnvilderClient(provider, spy_parser)
sut.resolve_secrets(map_file)

spy_parser.parse.assert_called_once_with(map_file)
4. Module Patch: patch / patch.object

Use patch to replace module-level objects or class methods.

Purpose: Replace external dependencies (boto3, file I/O, etc.).

python
from unittest.mock import patch


@patch("boto3.client")
def Should_CallSSM_When_AwsProviderUsed(mock_boto: Mock) -> None:
    # Arrange
    mock_ssm = Mock()
    mock_boto.return_value = mock_ssm
    mock_ssm.get_parameter.return_value = {"Parameter": {"Value": "secret"}}

    # Act
    sut = AwsSsmSecretProvider()
    actual = sut.get_secret("/app/key")

    # Assert
    assert actual == "secret"
    mock_ssm.get_parameter.assert_called_once()
5. Error Simulation: side_effect with Exception

Use side_effect with an exception to simulate failures.

Purpose: Test error paths and exception handling.

python
provider.get_secret.side_effect = ClientError(
    {"Error": {"Code": "ParameterNotFound"}}, "GetParameter"
)

Verification Patterns

Basic Verification
python
provider.get_secret.assert_called_once_with("/ssm/path")
provider.get_secret.assert_called_with("/ssm/path")
logger.info.assert_called_once()
Not Called
python
provider.get_secret.assert_not_called()
logger.error.assert_not_called()
Call Count
python
assert provider.get_secret.call_count == 3
Argument Inspection
python
from unittest.mock import call

provider.get_secret.assert_has_calls([
    call("/app/db"),
    call("/app/key"),
], any_order=True)
Async Verification
python
provider.get_secret.assert_awaited_once_with("/ssm/path")
provider.get_secret.assert_awaited()
provider.get_secret.assert_not_awaited()

Pytest Fixtures as Factories

Use fixtures to build test doubles with proper lifecycle:

python
@pytest.fixture()
def secret_provider() -> Mock:
    provider = Mock(spec=ISecretProvider)
    provider.get_secret.return_value = None
    return provider


@pytest.fixture()
def logger() -> Mock:
    return Mock(spec=ILogger)


@pytest.fixture()
def sut(secret_provider: Mock, logger: Mock) -> EnvilderClient:
    return EnvilderClient(provider=secret_provider, logger=logger)

Mother Pattern

Use factory functions or classes for reusable test data:

python
from dataclasses import dataclass
from typing import Optional
from uuid import UUID, uuid4


class MapFileMother:
    @staticmethod
    def create(
        provider: str = "aws",
        mappings: Optional[dict[str, str]] = None,
    ) -> ParsedMapFile:
        return ParsedMapFile(
            config=MapFileConfig(provider=provider),
            mappings=mappings or {"DB_URL": "/app/db"},
        )


class EnvilderOptionsMother:
    @staticmethod
    def create(
        provider: SecretProviderType = SecretProviderType.AWS,
        profile: Optional[str] = None,
        vault_url: Optional[str] = None,
    ) -> EnvilderOptions:
        return EnvilderOptions(
            provider=provider,
            profile=profile,
            vault_url=vault_url,
        )

Usage:

python
# Arrange
map_file = MapFileMother.create(mappings={"API_KEY": "/prod/key"})

Summary

Double TypePython APIPurpose
MockMock(spec=X)Controllable replacement
Stub.return_value / .side_effectPredefined responses
SpyMock(wraps=real)Observe real objects
Patch@patch("module.obj")Replace module-level deps
Error sim.side_effect = Exception(...)Failure paths

When writing tests:

  1. Create port mocks with Mock(spec=Interface) in fixtures
  2. Configure stubs with .return_value in Arrange
  3. Always verify mock interactions in Assert
  4. Use Mother pattern for complex test data
  5. Always use spec= to catch typo bugs
  6. Prefer fixture injection over inline Mock() creation

© macalbert, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .github/skills/python-test-doubles of macalbert/envilder.

Open the folder on GitHubat commit b6a0327

Compare with similar skills

Python Test Doubles next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Python Test Doubles compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Python Test Doubles this skillmacalbert/envilder138—~1.4kAutomated safety check: PassMIT
Agent-Core Python TestingopenJiuwen-ai/agent-core442—~2.3kAutomated safety check: PassApache-2.0
Python Testing Strategiesc0x12c/ai-toolkit106—~747Automated safety check: PassNone
Pytest Patternscohen-liel/hivemind110—~806Automated safety check: PassApache-2.0
Testing Patternssoftspark/ai-toolkit179—~1.6kAutomated safety check: PassApache-2.0
Jest Testing PatternsChrisWiles/claude-code-showcase6.1k7 repos~1.5kAutomated safety check: PassNone

Similar skills

  • Agent-Core Python Testing

    openJiuwen-ai/agent-core

    Pytest patterns for the agent-core codebase: a red-green-refactor workflow, conftest fixtures, custom marks, monkeypatch and patch mocking, and async tests.

    442 GitHub stars~2.3k tokensUpdated today
    Testing & QAAuto-check passed
  • Python Testing Strategies

    c0x12c/ai-toolkit

    Testing patterns for FastAPI with pytest-asyncio, httpx AsyncClient, fixtures, and test data factories.

    106 GitHub stars~747 tokensUpdated 3 mo ago
    Testing & QAAuto-check passed
  • Pytest Patterns

    cohen-liel/hivemind

    pytest best practices for writing comprehensive test suites.

    110 GitHub stars~806 tokensUpdated 5 mo ago
    Testing & QAAuto-check passed
  • Testing Patterns

    softspark/ai-toolkit

    Testing strategy: pyramid, AAA, mocks/fakes/stubs, flaky tests, coverage.

    179 GitHub stars~1.6k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Jest Testing Patterns

    ChrisWiles/claude-code-showcase

    Jest patterns for React Native style tests: TDD discipline, mock factory functions, module and GraphQL hook mocking, custom render helpers and anti-patterns to avoid.

    6.1k GitHub starsUsed in 7 repos~1.5k tokens
    Testing & QAAuto-check passed
  • Adk Verify Snippets

    google/adk-python

    Official

    Checks that every Python code block in a Markdown file actually compiles and runs, by extracting each block to a temporary file, executing it in an isolated subprocess, and writing a pass/fail…

    22k GitHub stars~1.4k tokensUpdated today
    Testing & QAAuto-check passed

More from macalbert/envilder

All 30 skills in this repo
  • Code Review Perspectives

    macalbert/envilder

    Five independent analysis perspectives for code review: correctness, architecture, security, conventions, and complexity.

    138 GitHub stars~1k tokensUpdated 3 days ago
    Auto-check passed
  • Index of Architecture Decision Records (ADRs) for cross-cutting technical decisions.

    138 GitHub stars~1.3k tokensUpdated 3 days ago
    Auto-check passed
  • Common Git

    macalbert/envilder

    Git commit messages, PR workflow, and branching strategy using Conventional Commits and Semantic Versioning.

    138 GitHub stars~991 tokensUpdated 3 days ago
    Auto-check passed
  • Common Testing Conventions

    macalbert/envilder

    Mandatory testing conventions including the narrow diagnostic exception for testing test-only code, AAA pattern, test naming, and assertions across all stacks (.NET, TypeScript, Python).

    138 GitHub stars~1.9k tokensUpdated 3 days ago
    Auto-check passed
  • Doc Maintenance

    macalbert/envilder

    Workflow for maintaining changelogs, READMEs, and documentation files.

    138 GitHub stars~904 tokensUpdated 3 days ago
    Auto-check passed
  • Doc Sync

    macalbert/envilder

    Audit and synchronize documentation across website, READMEs, and docs/.

    138 GitHub stars~1.3k tokensUpdated 3 days ago
    Auto-check passed

Works with

Categories

Questions about Python Test Doubles

What does Python Test Doubles do?

Test doubles with unittest.mock (Mock, AsyncMock, patch) and Mother pattern. Python Test Doubles is an agent skill from macalbert/envilder.mock (Mock, AsyncMock, patch) and Mother pattern.

When should I use Python Test Doubles?

Python Test Doubles fits situations like: creating test data; mocking dependencies; setting up fixtures in Python tests.

How do I install Python Test Doubles in Claude Code?

Run `npx skills add macalbert/envilder --skill python-test-doubles -a claude-code`. Or copy the skill folder (.github/skills/python-test-doubles in macalbert/envilder) into .claude/skills/python-test-doubles in your project. Claude Code loads it when a task matches its description.

How do I install Python Test Doubles in Codex?

Run `npx skills add macalbert/envilder --skill python-test-doubles -a codex`. Or copy the skill folder (.github/skills/python-test-doubles in macalbert/envilder) into .agents/skills/python-test-doubles in your project. Codex loads it when a task matches its description.

Can I use Python Test Doubles in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add macalbert/envilder --skill python-test-doubles -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/python-test-doubles, .gemini/skills/python-test-doubles, .github/skills/python-test-doubles and .opencode/skills/python-test-doubles in your project.

What does Python Test Doubles need to run?

Going by SKILL.md and its folder, Python Test Doubles needs credentials named API_KEY. Our summary lists: Python 3; A credential in API_KEY.

Does Python Test Doubles access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Python Test Doubles safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Python Test Doubles use?

Python Test Doubles is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Python Test Doubles use?

About 1.4k tokens (SKILL.md is roughly 5.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Python Test Doubles?

Skills that share tags, products or a category with Python Test Doubles: Agent-Core Python Testing (openJiuwen-ai/agent-core, 442 stars), Python Testing Strategies (c0x12c/ai-toolkit, 106 stars), Pytest Patterns (cohen-liel/hivemind, 110 stars) and Testing Patterns (softspark/ai-toolkit, 179 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Python Test Doubles?

macalbert (a GitHub user) maintains it in macalbert/envilder, which has 138 GitHub stars. The repository holds 30 skills in this directory. The repository was last updated on October 5, 2026.

Source: macalbert/envilder on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.