2011-04-25 8 views
28

Soy nuevo en Django y me gustaría probar la unidad de una vista que requiere que el usuario inicie sesión (@login_requred). Django amablemente proporciona la RequestFactory, que puedo utilizar teóricamente para llamar a la vista directa:Pruebe las vistas de Django que requieren iniciar sesión usando RequestFactory

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' 

Al parecer, this is intentional, pero ¿dónde quedo yo? ¿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.

+0

pienso Django Test Client http://docs.djangoproject.com/en/dev/topics/testing/, debería ser lo que estás buscando. – dm03514

Respuesta

46

Al utilizar RequestFactory, está probando la vista con entradas exactamente conocidas.

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

Puede petición de establecimiento con cualquier dato adicional que ver la función de espera, es decir:

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

Mi recomendación personal es utilizar TestClient hacer las pruebas de integración (es decir: todo proceso de compra del usuario en la tienda, que incluye muchos pasos) y RequestFactory para probar el comportamiento de las funciones de vista independientes y su resultado (es decir, agregar producto al carrito).

+0

AttributeError: el objeto 'dict' no tiene ningún atributo 'flush' 'Django 1.11' –

14

Como se mencionó en @bmihelac, RequestFactory solo está probando entradas conocidas (lo que significa que no se incluye middleware). Para detalles sobre el razonamiento, lea here. 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 utilizar SessionMiddleware de Django (o cualquier Middleware), se puede hacer algo como esto en sus pruebas (el ejemplo siguiente es para probar una vista basada 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) 
Cuestiones relacionadas