2014-07-15 4 views
3

Mes tests unitaires échouent lorsque je veux tester la fonctionnalité de connexion. Quand je teste dans mon navigateur, c'est OK.Échec du test de connexion Django-Python Django avec factory_boy et Authtools

J'utilise:

django==1.6.5 
factory-boy==2.4.1 
WebTest==2.0.15 
django-webtest==1.7.7 
nose==1.3.3 
django-nose==1.2 

Il n'y a pas de modèle utilisateur personnalisé. Le modèle utilisateur est authtools.models.User.

Mes vues:

from authtools.views import LoginView 
from django.views.generic import TemplateView 
from django.core.urlresolvers import reverse 

class Home_view(LoginView): 
    template_name = 'users/home.html' 
    disallow_authenticated = False 

    def get_success_url(self): 
     return reverse('users:blob') 


class Blob_view (TemplateView): 
    template_name = "users/blob.html" 

Mes usines:

import factory 


from django.conf import settings 
from django.contrib.auth.hashers import make_password 

class UserFactory (factory.DjangoModelFactory): 
    """ 
    Factory used to instanciate a :class: Users.User 
    """ 

    class Meta: 
     model = settings.AUTH_USER_MODEL 

    name = factory.Sequence(lambda n: 'user%d' % n) 
    email = factory.LazyAttribute(lambda obj: '%[email protected]' % obj.name) 
    password = make_password('eCRD') 
    is_active = True 

Mes tests: Il y a deux tests. Le premier test de la connexion du client, le deuxième test les vues:

from django.core.urlresolvers import reverse 


from django_webtest import WebTest 
from authtools.models import User 
from rest_framework import status 


from .factories import UserFactory 


class UserLoginTests(WebTest): 

    def setUp(self): 
     self.user = UserFactory() 


    def tearDown(self): 
     User.objects.get(email = self.user.email).delete() 

    def test_user_login_client(self): 
     self.resp = self.client.login(username = self.user.email, password = self.user.password 
     ) 
     self.assertEqual(self.resp, True) 
     self.client.logout() 

    def test_user_logsin_view(self): 
     Home_View = self.app.get(reverse('users_home')) 
     Login_Form = Home_View.forms['login-form'] 
     Login_Form['username'] = self.user.email 
     Login_Form['password'] = self.user.password 
     response = Login_Form.submit().follow() 
     self.assertEqual(redirect.status_code, status_HTTP_200_ok) 
     self.client.logout() 

Les deux tests ont échoué. Mais dans le navigateur, cela fonctionne bien.

Merci.

Répondre

4

Je me réponds. La solution est: Factory_boy sous l'appel de hook à la fonction model.objects.create(). Lorsque vous créez l'utilisateur, appelez le modèle d'authentification à model.objects.create_user(). Les deux œuvres! Mais le différent est create_user utilise django.contrib.auth.hashers.make_password pour l'identification de mot de passe et crée le mot de passe de sauvegarde de fucntion en tant que texte simple. Ensuite, la solution est:

from django.core.urlresolvers import reverse 


from django_webtest import WebTest 
from authtools.models import User 
from rest_framework import status 


from .factories import UserFactory, user_password 


class UserLoginTests(WebTest): 

    def setUp(self): 
     self.user = UserFactory() 


    def tearDown(self): 
     User.objects.get(email = self.user.email).delete() 

    def test_user_login_client(self): 
     self.resp = self.client.login(username = self.user.email, password = user_password 
     ) 
     self.assertEqual(self.resp, True) 
     self.client.logout() 

    def test_user_logsin_view(self): 
     Home_View = self.app.get(reverse('users_home')) 
     Login_Form = Home_View.forms['login-form'] 
     Login_Form['username'] = self.user.email 
     Login_Form['password'] = user_password 
     response = Login_Form.submit().follow() 
     self.assertEqual(redirect.status_code, status_HTTP_200_ok) 
     self.client.logout() 

Et les usines

import factory 


from django.conf import settings 
from django.contrib.auth.hashers import make_password 

user_passwprd = 'test'  

class UserFactory (factory.DjangoModelFactory): 
    """ 
    Factory used to instanciate a :class: Users.User 
    """ 

    class Meta: 
     model = settings.AUTH_USER_MODEL 

    name = factory.Sequence(lambda n: 'user%d' % n) 
    email = factory.LazyAttribute(lambda obj: '%[email protected]' % obj.name) 
    password = make_password(user_password) 
    is_active = True