2010-04-24 2 views
8

Sto provando a costruire un test per una vista decorata con @login_required, dato che non sono riuscito a farlo funzionare, ho fatto un semplice test e ancora non riesco fallo passare.Django: test fallito su una vista con @login_required

Ecco il codice per il semplice test e 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() è il risparmio all'utente e v'è una prova all'interno tale metodo vedere che sta lavorando.

Il test fallisce nel response.status_code, restituendo 302 e l'istanza risposta è di HttpResponseRedirect, è orientarli come se non connesso.

Dell'indizio? Mi manca qualcosa?

saluti Esteban

risposta

3

ecco la risposta:

Python 2.6.5 fatto un cambiamento al modo in cui cookie vengono memorizzati che è sottilmente incompatibile con il client di prova. Questo problema è stato risolto nel 1.1.X e nelle diramazioni del tronco, ma la correzione non è ancora stata convertita in una versione formale .

Se si utilizza 1.1.X e Python 2.6.5, si avranno problemi con qualsiasi attività di test che coinvolge i cookie . È necessario eseguire il downgrade di Python oppure utilizzare il ramo 1.1.X piuttosto rispetto alla versione 1.1.1.

A 1.1.2 di rilascio (che includerà la correzione per il problema che si descrive) sarà essere fatta allo stesso tempo che noi rilasciamo 1.2 - si spera, molto molto presto.

Distinti, Russ Magee% -)

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

21

Questo testcase funziona per me:

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) 

io vi proponiamo (se non vengono utilizzati già) per utilizzare il() funzione inversa e nominare gli URL . In questo modo sei sicuro di avere sempre l'URL giusto.

+0

@aeby: ho copiato e incollato il codice e ancora ottenere un 302, stai usando @login_required nella tua vista? –

+0

Django versione 1.1.1 - ricontrollato che la vista testlogin sta lavorando dal browser e che è disponibile solo per il login utente –

+0

Yes I do: da django.contrib.auth.decorators importare login_required @login_required def testlogin (richiesta): restituire HttpResponse ("Test") –

0

OK ero ad affrontare lo stesso problema @resto risolto il mio problema.

creando utente in questo modo qui di seguito, consente al client di prova ottenere l'utente connesso in e ottenere la risposta diversa da reindirizzare (302)

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