Probar vistas de Django que requieren inicio de sesión utilizando RequestFactory

Soy nuevo en Django y me gustaría probar una vista que requiere que el usuario esté conectado ( @login_requred ). Django amablemente proporciona el RequestFactory , que teóricamente puedo usar para llamar directamente a la vista:

 factory = RequestFactory() request = factory.get("/my/home/url") response = views.home(request) 

Sin embargo, la llamada falla con

 AttributeError: 'WSGIRequest' object has no attribute 'session' 

Aparentemente, esto es intencional , pero ¿dónde me deja eso? ¿Cómo pruebo las vistas que requieren autenticación (que en mi caso son todas)? ¿O estoy tomando el enfoque equivocado por completo?

Estoy usando Django 1.3 y Python 2.7.

Cuando utiliza RequestFactory, está probando la vista con entradas exactamente conocidas.

Eso permite aislar las pruebas del impacto del procesamiento adicional realizado por varios componentes de middleware instalados y, por lo tanto, realizar pruebas más precisas.

Puede configurar la solicitud con cualquier dato adicional que la función de vista espere, es decir:

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

Mi recomendación personal es usar TestClient para realizar pruebas de integración (es decir, el proceso completo de verificación del usuario en la tienda que incluye muchos pasos) y RequestFactory para probar el comportamiento de las funciones de visualización independiente y su salida (es decir, agregar el producto al carrito).

Como mencionó @bmihelac, RequestFactory solo está probando entradas conocidas (lo que significa que no se incluye middleware). Para más detalles sobre el razonamiento, lea aquí . La solución aceptada es excelente si desea una sesión en blanco (y estoy de acuerdo con @ dm03514 en que el Cliente debe usarse para las pruebas de integración).

Sin embargo, si aún desea usar el SessionMiddleware de Django (o cualquier Middleware), puede hacer algo como esto en sus pruebas (el siguiente ejemplo es para probar una vista basada en clase):

 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)