72

I have a function as

def getEvents(eid, request):
    ......

Now I want to write unit test for the above function separately (without calling the view). So how should I call the above in TestCase. Is it possible to create request ?

5 Answers 5

117

See this solution:

from django.utils import unittest
from django.test.client import RequestFactory

class SimpleTest(unittest.TestCase):
    def setUp(self):
        # Every test needs access to the request factory.
        self.factory = RequestFactory()

    def test_details(self):
        # Create an instance of a GET request.
        request = self.factory.get('/customer/details')

        # Test my_view() as if it were deployed at /customer/details
        response = my_view(request)
        self.assertEqual(response.status_code, 200)
        
3
  • 4
    This code has actually been included in Django since version 1.3. Commented Apr 23, 2012 at 9:28
  • 2
    If I see this correctly, that fake request from the factory doesn't get filtered through middleware(s). Commented Sep 8, 2014 at 10:01
  • I was really confused by Roseman's comment, but the answer used to include code for RequestFactory. Nothing currently includes it in the TestCase, so you still have to import it as shown in this answer. Commented Dec 4, 2023 at 14:21
54

If you are using django test client (from django.test.client import Client) you can access request from response object like this:

from django.test.client import Client

client = Client()
response = client.get(some_url)
request = response.wsgi_request

or if you are using django.TestCase(from django.test import TestCase, SimpleTestCase, TransactionTestCase) you can access client instance in any testcase just by typing self.client:

response = self.client.get(some_url)
request = response.wsgi_request
15

Use RequestFactory to create a dummy request.

0
0

You mean def getEvents(request, eid) right?

With Django unittest, you can use the from django.test.client import Client to make request.

See here: Test Client

@Secator's answer is prefect as it creates a mock object which is really preferred for a really good unittest. But depending on your purpose, it might be easier to just use Django's test tools.

0

You can use django test client

from django.test import Client
c = Client()
response = c.post('/login/', {'username': 'john', 'password': 'smith'})
response.status_code
response = c.get('/customer/details/')
response.content

for more details
https://docs.djangoproject.com/en/1.11/topics/testing/tools/#overview-and-a-quick-example

Not the answer you're looking for? Browse other questions tagged or ask your own question.