Протестируйте представления Django, требующие входа в систему, с помощью RequestFactory.

Я новичок в Django, и я хотел бы протестировать представление, которое требует, чтобы пользователь вошел в систему (@login_requred). Django любезно предоставляет RequestFactory, который я теоретически могу использовать для прямого вызова представления:

factory = RequestFactory()
request = factory.get("/my/home/url")
response = views.home(request)

Однако вызов не выполняется с

AttributeError: 'WSGIRequest' object has no attribute 'session'

По-видимому, это сделано намеренно, но что мне делать? Как протестировать представления, требующие аутентификации (в моем случае это все)? Или я использую неправильный подход?

Я использую Django 1.3 и Python 2.7.


person EMP    schedule 25.04.2011    source источник
comment
Я думаю, тестовый клиент Django docs.djangoproject.com/en/dev/topics/testing, должно быть то, что вы ищете.   -  person dm03514    schedule 25.04.2011


Ответы (2)


При использовании RequestFactory вы тестируете представление с точно известными входными данными.

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

Вы можете настроить запрос с любыми дополнительными данными, которые ожидает функция просмотра, например:

    request.user = AnonymousUser()
    request.session = {}

Моя личная рекомендация — использовать TestClient для проведения интеграционного тестирования (т. е. всего процесса оформления заказа пользователем в магазине, который включает в себя множество шагов) и RequestFactory для тестирования поведения независимых функций просмотра и их вывода (т. е. добавления товара в корзину).

person bmihelac    schedule 12.06.2011
comment
AttributeError: объект 'dict' не имеет атрибута 'flush' Django 1.11 - person Raja Simon; 16.10.2017
comment
Проголосовал, спасибо. Ссылка на документацию по Django 3.0: docs.djangoproject.com/en /3.0/ref/contrib/авторизация/ - person Joseph Victor Zammit; 09.05.2020

Как упоминал @bmihelac, RequestFactory тестирует только известные входные данные (что означает, что промежуточное программное обеспечение не включено). Подробнее о причинах читайте здесь. Принятое решение отлично подходит, если вам нужен пустой сеанс (и я согласен с @ dm03514 в том, что клиент следует использовать для интеграционного тестирования).

Однако, если вы все еще хотите использовать SessionMiddleware Django (или любое промежуточное ПО), вы можете сделать что-то подобное в своих тестах (пример ниже предназначен для тестирования представления на основе классов):

from django.contrib.sessions.middleware import SessionMiddleware
from django.test import TestCase, RequestFactory
from someapp.views import SomeView  # a Class Based View


class SomePageTest(TestCase):

    def setUp(self):
        self.factory = RequestFactory()

    def test_some_page_requires_session_middleware(self):
        # Setup
        request = self.factory.get('somepage.html')
        middleware = SessionMiddleware()
        middleware.process_request(request)
        request.session.save()

        response = SomeView.as_view()(request)

        self.assertEqual(response.status_code, 200)
person Will    schedule 09.12.2015