Skip to content

Django Testing

Use this page as the canonical reference for testing Wireup in Django projects.

For general testing guidance, also see Testing.

Test @inject Request Handlers

Use Django's Client for sync views and AsyncClient for async views.

from django.test import Client, AsyncClient


def test_sync_view():
    client = Client()
    response = client.get("/greet/?name=World")
    assert response.status_code == 200


async def test_async_view():
    client = AsyncClient()
    response = await client.get("/async-greet/?name=World")
    assert response.status_code == 200

Test @inject_app Management Commands

Use call_command(...) and capture output with StringIO.

from io import StringIO
from django.core.management import call_command


def test_greet_command():
    out = StringIO()
    call_command("greet", "--name=World", stdout=out)
    assert out.getvalue().strip() == "Hello World"

Override Dependencies in Tests

Use app-container overrides for both request and app-level tests.

Example: Override an injected service for an HTTP endpoint test.

from django.test import Client
from wireup.integration.django import get_app_container

from myapp.services import GreeterService


def test_override_http_endpoint():
    class FakeGreeter:
        def greet(self, name: str) -> str:
            return f"Hi {name}"

    client = Client()
    with get_app_container().override.injectable(
        GreeterService, new=FakeGreeter()
    ):
        response = client.get("/greet/?name=World")

    assert response.status_code == 200
    assert response.content.decode("utf8") == "Hi World"

Example: Override an injected service for a management command test.

from io import StringIO
from django.core.management import call_command
from wireup.integration.django import get_app_container

from myapp.services import GreeterService


def test_override_command():
    class FakeGreeter:
        def greet(self, name: str) -> str:
            return f"Hi {name}"

    out = StringIO()
    with get_app_container().override.injectable(
        GreeterService, new=FakeGreeter()
    ):
        call_command("greet", "--name=World", stdout=out)

    assert out.getvalue().strip() == "Hi World"

DRF and Ninja

DRF and Ninja handlers should use @inject explicitly. Their tests follow the same pattern as Django views:

  • call endpoint via test client
  • assert response
  • use override.injectable(...) when needed