Протестируйте представления Django, требующие входа в систему, используя RequestFactory - PullRequest
31 голосов
/ 25 апреля 2011

Я новичок в Django, и я хотел бы провести модульное тестирование представления, которое требует, чтобы пользователь вошел в систему (@login_requred). Джанго любезно предоставил 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.

Ответы [ 2 ]

49 голосов
/ 12 июня 2011

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

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

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

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

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

21 голосов
/ 10 декабря 2015

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

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...