Тестирование представлений 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.
Ответы
Ответ 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)