Подтвердить что ты не робот

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

Я новичок в Django, и я хотел бы unit test показать, что пользователь должен войти в систему (@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.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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)