2010-04-24 3 views
8

J'essaye de construire un test pour une vue qui est décorée avec @login_required, puisque je n'ai pas réussi à le faire fonctionner, j'ai fait un simple test et je ne peux toujours pas faites-le passer.Django: test échouant sur une vue avec @login_required

Voici le code pour le test simple et la vue:

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() sauve l'utilisateur et il y a un test dans cette méthode pour voir qui fonctionne.

Le test échoue dans le response.status_code, le retour 302 et l'instance de réponse est d'un HttpResponseRedirect, réoriente comme sinon connecté.

Un indice? Il me manque quelque chose?

Cordialement Esteban

Répondre

3

Voici la réponse:

Python 2.6.5 fait une modification de la façon dont les cookies sont stockés qui est subtilement incompatible avec le client de test. Ce problème a été corrigé dans les branches 1.1.X et trunk , mais le correctif n'est pas encore entré dans une version officielle .

Si vous utilisez 1.1.X et Python 2.6.5, vous allez rencontrer des problèmes avec toute activité de test impliquant des cookies . Vous devez soit rétrograder Python , ou utiliser la branche 1.1.X plutôt que la version 1.1.1.

A 1.1.2 version (qui comprendra le correctif pour le problème que vous décrivez) sera être faite en même temps que nous version 1.2 - espérons-le, très très bientôt.

vôtre, Russ Magee% -)

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

21

Ce testcase fonctionne pour moi:

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) 

Je vous suggère (si vous ne les utilisez pas déjà) d'utiliser l'inverse() fonctionet nommez vos URL . De cette façon, vous êtes sûr que vous obtenez toujours la bonne URL.

+0

@aeby: Je copié et collé votre code et toujours obtenir un 302, utilisez-vous @login_required à votre avis? –

+0

Django version 1.1.1 - Double vérifié que la vue testlogin travaille à partir du navigateur et qui est disponible uniquement par utilisateur connecté –

+0

Oui je fais: de django.contrib.auth.decorators importation login_required @login_required def testlogin (demande): return HttpResponse ("Test") –

0

OK, je devais même problème face @resto résolu mon problème.

création utilisateur de cette façon ci-dessous, permet au client de test obtenir l'utilisateur connecté et obtenir la réponse autre que redirect (302)

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