2010-04-24 17 views
8

Estoy intentando construir una prueba para una vista que está decorada con @login_required, ya que no pude hacerlo funcionar, hice una prueba simple y todavía no puedo hazlo pasarDjango: error de prueba en una vista con @login_required

Aquí es el código de la simple prueba y la vista:

def test_login(self): 
    user = self._create_new_user() 
    self.assertTrue(user.is_active) 
    login = self.client.login(username=user.username, 
password=self.data['password1']) 
    self.failUnless(login, 'Could not log in') 
    response = self.client.get('/accounts/testlogin/') 
    self.assertEqual(response.status_code, 200) 

@login_required 
def testlogin(request): 
    print 'testlogin !! ' 
    return HttpResponse('OK') 

_create_new_user() es el ahorro al usuario y no es una prueba de que en el interior método para ver que está trabajando.

la prueba falla en el response.status_code, volviendo 302 y la instancia respuesta es de un HttpResponseRedirect, se redirigir como si no iniciado sesión.

Alguna pista? Me falta algo?

Saludos Esteban

Respuesta

3

Aquí está la respuesta:

Python 2.6.5 realiza un cambio en la forma en que se almacenan cookies que es sutilmente incompatible con el cliente de prueba. Este problema se ha solucionado en el 1.1.X y las ramas del tronco, pero la corrección aún no se ha convertido en una versión formal .

Si está utilizando 1.1.X y Python 2.6.5, tendrá problemas con cualquier actividad de prueba que implique las cookies . O bien debe degradar Python, o utilizar la rama 1.1.X en lugar de la versión 1.1.1 en vez de .

Una versión 1.1.2 (que incluirá el arreglo para el problema que usted describe) se hacerse al mismo tiempo que Versión 1.2 - con suerte, muy pronto .

Suyo, Russ Magee% -)

http://groups.google.com/group/django-users/browse_frm/thread/617457f5d62366ae/05f0c01fff0b9e6d?hl=en&lnk=gst&q=2.6.5#05f0c01fff0b9e6d

21

Este caso de prueba que funciona para mí:

from django.contrib.auth.models import User 
from django.core.urlresolvers import reverse 
from django.test.client import Client 
import unittest 

class LoginTestCase(unittest.TestCase): 
    def setUp(self): 
     self.client = Client() 
     self.user = User.objects.create_user('john', '[email protected]', 'johnpassword') 

    def testLogin(self): 
     self.client.login(username='john', password='johnpassword') 
     response = self.client.get(reverse('testlogin-view')) 
     self.assertEqual(response.status_code, 200) 

te sugieren (si no se utilicen ya) a utilizar el inversa() función y asignar nombres a las direcciones URL . De esta manera, está seguro de que siempre obtiene la URL correcta.

+0

@aeby: He copiado y pegado el código y aún así obtener una 302, ¿Estás usando @login_required en tu vista? –

+0

Django versión 1.1.1 - Doble comprobó que la vista TESTLOGIN está trabajando desde el navegador y que está disponible solamente por el usuario conectado en –

+0

Sí, lo creo: de django.contrib.auth.decorators importar a partir de login_required @login_required def TESTLOGIN (petición): return HttpResponse ("Test") –

0

OK Estaba a frente mismo problema @resto resolvió mi problema.

creando de esta manera el usuario a continuación, permite obtener el cliente de prueba al usuario conectado y obtener la respuesta que no sea redirigir (302)

self.user = User.objects.create_user('john', '[email protected]', 'johnpassword') 
Cuestiones relacionadas