Объект HttpResponseRedirect не имеет атрибута client.

Джанго 1.9.6

Я хотел бы написать модульный тест для проверки перенаправления.

Не могли бы вы помочь мне понять, что я делаю неправильно здесь.

Заранее спасибо.

Тест:

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"))

Результат:

ОШИБКА: test_anonymous_user_redirected_to_login_page (general.tests.GeneralTest)

Отслеживание (последний последний вызов): файл "/home/michael/workspace/photoarchive/photoarchive/general/tests.py", строка 44, в 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", строка 326, в assertRedirects redirect_response = response.client.get(path, QueryDict(query), AttributeError: Объект «HttpResponseRedirect» не имеет атрибута «клиент»


Провел 3 теста за 0,953 с.

Что говорит пдб:

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

person Michael    schedule 31.05.2016    source источник


Ответы (2)


Вам нужно добавить клиента в объект ответа. См. обновленный код ниже.

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"))
person Christian Vanderwall    schedule 29.09.2016

Похоже, вы напрямую вызываете представление get напрямую, а не используете встроенный Client. Когда вы используете тестовый клиент, вы возвращаете свой экземпляр клиента в ответ, предположительно для таких случаев, как этот, когда вы хотите проверить/получить перенаправление.

Одним из решений может быть использование клиента для получения ответа от вашего представления. Другой способ — вставить клиента в ответ, как упоминалось выше.

Третий вариант — указать assertRedirects не получать перенаправление. Нет необходимости в клиенте, если вы не запрашиваете утверждение для получения перенаправления. Это делается путем добавления fetch_redirect_response=False к вашему утверждению.

person Michael S    schedule 29.10.2018