Skip to content

Testing

Django Ninja is fully compatible with standard django test client , but also provides a test client to make it easy to test just APIs without middleware/url-resolver layer making tests run faster.

To test the following API:

from ninja import NinjaAPI, Schema

api = NinjaAPI()
router = Router()

class HelloResponse(Schema):
    msg: str

@router.get("/hello", response=HelloResponse)
def hello(request):
    return {"msg": "Hello World"}

api.add_router("", router)

You can use the Django test class:

from django.test import TestCase
from ninja.testing import TestClient

class HelloTest(TestCase):
    def test_hello(self):
        client = TestClient(router)
        response = client.get("/hello")

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json(), {"msg": "Hello World"})

It is also possible to access the deserialized data using the data property:

    self.assertEqual(response.data, {"msg": "Hello World"})

Arbitrary attributes can be added to the request object by passing keyword arguments to the client request methods:

class HelloTest(TestCase):
    def test_hello(self):
        client = TestClient(router)
        # request.company_id will now be set within the view
        response = client.get("/hello", company_id=1)

It is also possible to specify headers, both from the TestCase instanciation and the actual request:

    client = TestClient(router, headers={"A": "a", "B": "b"})
    # The request will be made with {"A": "na", "B": "b", "C": "nc"} headers
    response = client.get("/test-headers", headers={"A": "na", "C": "nc"})