La publicación del cliente de prueba de Django () devuelve 302 a pesar del error en la publicación de la vista ()

Actualmente estoy escribiendo algunas pruebas básicas para garantizar que las páginas en una aplicación Django de tamaño mediano estén obteniendo y publicando correctamente. Sin embargo, el uso de django.test.client.Client no está fallando de manera confiable cuando debería estarlo. Devuelve una respuesta 302 incluso cuando obviamente hay errores colocados en mi código.

en mi aplicación / urls.py:

url(r'^mymodel/create/$', views.MyModelView.as_view(), name = 'my_model_create'), 

Luego, en los bashs de crear intencionalmente una respuesta 500, hice lo siguiente:

 class MyModelCreateView(MyModelView, CreateView): def post(self, request, *args, **kwargs): print self.hello self.object = MyModel() return super(MyModelCreateView, self).post(request, *args, **kwargs) 

Obviamente, la vista no tiene ningún objeto llamado hola. Esto falla como se esperaba al intentar enviar la solicitud a través del navegador.

e incluso fue tan lejos como para reemplazar “print self.hello” con

 return HttpResponse(status = 500) 

Y sin embargo, todavía me sale lo siguiente:

 #We have a model called Client, so it #is imported as RequestClient to avoid conflicts In [1]: from django.test.client import Client as RequestClient In [2]: client = RequestClient() In [3]: response = client.post("/app/mymodel/create/") In [4]: response.status_code Out[4]: 302 

Claramente, el problema aquí está entre el teclado y la silla, ya que no hay ninguna razón por la cual el Cliente () / RequestClient () no deba devolver un error 500 si se hace correctamente. Incluso algunos problemas surgen cuando recibo 302 respuestas para solicitudes POST en lugar de 200 respuestas, pero eso puede ser porque estamos usando HttpRedirect.

¿Alguien por ahí sabe cuál puede ser el problema aquí? Para referencia, estoy en Python 2.7 y Django 1.5 (aunque es posible que tenga que ser compatible con Django 1.4).

No está del todo claro por qué está obteniendo una redirección, pero si desea seguirla, debe indicar a RequestClient que siga las redirecciones, según la documentación :

Si establece follow en True el cliente seguirá cualquier redireccionamiento y se establecerá un atributo redirect_chain en el objeto de respuesta que contiene tuplas de las URL intermedias y los códigos de estado.

Entonces tu código de prueba debería verse como:

python response = client.post("/app/mymodel/create/", follow=True)

Valdría la pena revisar la cadena de solicitudes para ver dónde se enrutó exactamente.