6
votes

Django 1.9.6

I'd like to write some unit test for checking redirection.

Could you help me understand what am I doing wrongly here.

Thank you in advance.

The test:

from django.test import TestCase
from django.core.urlresolvers import reverse
from django.http.request import HttpRequest
from django.contrib.auth.models import User

class GeneralTest(TestCase):

    def test_anonymous_user_redirected_to_login_page(self):
        user = User(username='anonymous', email='[email protected]', password='ttrrttrr')
        user.is_active = False        
        request = HttpRequest()
        request.user = user
        hpv = HomePageView()
        response = hpv.get(request)
        self.assertRedirects(response, reverse("auth_login"))

The result:

ERROR: test_anonymous_user_redirected_to_login_page (general.tests.GeneralTest)

Traceback (most recent call last): File "/home/michael/workspace/photoarchive/photoarchive/general/tests.py", line 44, in test_anonymous_user_redirected_to_login_page self.assertRedirects(response, reverse("auth_login")) File "/home/michael/workspace/venvs/photoarchive/lib/python3.5/site-packages/django/test/testcases.py", line 326, in assertRedirects redirect_response = response.client.get(path, QueryDict(query), AttributeError: 'HttpResponseRedirect' object has no attribute 'client'


Ran 3 tests in 0.953s

What pdb says:

-> self.assertRedirects(response, reverse("auth_login"))
(Pdb) response
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/login/">
2

2 Answers

5
votes

You need to add a client to the response object. See the updated code below.

from django.test import TestCase, Client
from django.core.urlresolvers import reverse
from django.http.request import HttpRequest
from django.contrib.auth.models import User

class GeneralTest(TestCase):

    def test_anonymous_user_redirected_to_login_page(self):
        user = User(username='anonymous', email='[email protected]', password='ttrrttrr')
        user.is_active = False        
        request = HttpRequest()
        request.user = user
        hpv = HomePageView()
        response = hpv.get(request)
        response.client = Client()
        self.assertRedirects(response, reverse("auth_login"))
4
votes

Looks like you are directly calling your view's get directly rather than using the built-in Client. When you use the test client, you get your client instance back in the response, presumably for cases such as this where you want to check/fetch a redirect.

One solution would be to use the client to fetch the response from your view. Another is to stick a client in the response as mentioned above.

A third option is tell assertRedirects not to fetch the redirect. There is no need for client if you don't ask the assertion to fetch the redirect. That's done by adding fetch_redirect_response=False to your assertion.