スキル一覧に戻る
MaksimZayats

test-writer

by MaksimZayats

test-writerは、other分野における実用的なスキルです。複雑な課題への対応力を強化し、業務効率と成果の質を改善します。

185🍴 36📅 2026年1月23日
GitHubで見るManusで実行

SKILL.md


name: test-writer description: Writes tests using IoC overrides and test factories. version: 1.0.0

Test Writer Skill

This skill guides you through writing tests for this codebase using the established test patterns with IoC container overrides and test factories.

Quick Reference: Test Locations

Test TypeLocationWhen to Use
HTTP API integrationtests/integration/http/<domain>/Testing controllers via HTTP
Celery task integrationtests/integration/tasks/Testing background tasks
Unit teststests/unit/<domain>/Testing services in isolation

Core Testing Patterns

1. Function-Scoped Container (Isolation)

Every test gets a fresh IoC container:

from infrastructure.frameworks.punq import AutoRegisteringContainer
from ioc.container import ContainerFactory


@pytest.fixture(scope="function")
def container() -> AutoRegisteringContainer:
    container_factory = ContainerFactory()
    return container_factory()

This enables:

  • Complete test isolation
  • Per-test IoC overrides for mocking
  • No shared state between tests

2. Test Factories

Available factories in tests/integration/factories.py:

FactoryCreatesUsage
TestClientFactoryHTTP test clienttest_client_factory(auth_for_user=user)
TestUserFactoryTest usersuser_factory(username="test")
TestCeleryWorkerFactoryCelery worker contextwith celery_worker_factory():
TestTasksRegistryFactoryTask registrytasks_registry_factory()

3. IoC Override Pattern

Critical: Override BEFORE creating factories.

@pytest.mark.django_db(transaction=True)
def test_with_mock(
    container: AutoRegisteringContainer,
    user_factory: TestUserFactory,
) -> None:
    # 1. Create mock
    mock_service = MagicMock(spec=SomeService)
    mock_service.some_method.return_value = expected_value

    # 2. Override BEFORE creating test client
    container.register(SomeService, instance=mock_service)

    # 3. Create test client (uses mock)
    user = user_factory()
    test_client_factory = TestClientFactory(container=container)
    with test_client_factory(auth_for_user=user) as test_client:
        # 4. Make request
        response = test_client.get("/v1/endpoint/")

    # 5. Assert
    assert response.status_code == HTTPStatus.OK
    mock_service.some_method.assert_called_once()

HTTP API Test Template

@pytest.mark.django_db(transaction=True)
def test_create_success(self, test_client_factory: TestClientFactory, user: User) -> None:
    with test_client_factory(auth_for_user=user) as test_client:
        response = test_client.post("/v1/<domain>s/", json={"name": "Test"})

    assert response.status_code == HTTPStatus.OK

Full CRUD test template: See references/testing-new-features.md

Celery Task Test Template

with celery_worker_factory():
    result = registry.<task_name>.delay().get(timeout=5)
assert result == expected_value

Full task test patterns: See references/test-scenarios.md

Mocking Patterns

Mock Return Value

mock_service = MagicMock(spec=ProductService)
mock_service.get_by_id.return_value = Product(id=1, name="Test")

Mock Exception

mock_service = MagicMock(spec=ProductService)
mock_service.get_by_id.side_effect = ProductNotFoundError("Not found")

Verify Mock Called

mock_service.get_by_id.assert_called_once_with(product_id=1)
mock_service.create.assert_called_with(name="Test", price=99.99)

Test Markers

MarkerWhen to Use
@pytest.mark.django_dbAny test accessing database
@pytest.mark.django_db(transaction=True)Integration tests (required)
@pytest.mark.slowTests > 1 second

Running Tests

# All tests with coverage
make test

# Specific file
pytest tests/integration/http/<domain>/test_<domain>.py -v

# Specific class
pytest tests/integration/http/<domain>/test_<domain>.py::TestCreate<Model> -v

# With coverage report
pytest --cov=src --cov-report=html

Creating a Custom Test Factory

class Test<Model>Factory(ContainerBasedFactory):
    def __call__(self, user: User, name: str = "Test") -> <Model>:
        return self._container.resolve(<Domain>Service).create(user_id=user.pk, name=name)

Full factory + fixture pattern: See references/testing-new-features.md

Common Testing Scenarios

See references/test-scenarios.md for:

  • User-scoped resource tests
  • Error handling tests
  • Pagination tests
  • Rate limiting tests
  • Async controller tests

Documentation

For detailed testing guidance:

  • Tutorial: docs/en/tutorial/06-testing.md
  • IoC overrides: docs/en/how-to/override-ioc-in-tests.md

スコア

総合スコア

85/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

+5
最近の活動

1ヶ月以内に更新

+10
フォーク

10回以上フォークされている

+5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

+5

レビュー

💬

レビュー機能は近日公開予定です