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

#python #django #unit-testing #django-views

#python #django #модульное тестирование #django-views

Вопрос:

Я новичок в 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.

Комментарии:

1. Я думаю, что тестовый клиент Django docs.djangoproject.com/en/dev/topics/testing , должно быть тем, что вы ищете.

Ответ №1:

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

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

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

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

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

Комментарии:

1. Ошибка атрибута: объект ‘dict’ не имеет атрибута ‘flush’ Django 1.11

2. Поддержано, спасибо. Ссылка на документы Django 3.0: docs.djangoproject.com/en/3.0/ref/contrib/auth /…

Ответ №2:

Как упоминал @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)