#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)