2014-07-15 4 views
3

로그인 기능을 테스트하려고 할 때 단위 테스트가 실패합니다. 내 브라우저에서 테스트 할 때 괜찮습니다.Django-Python Django factory_boy 및 Authtools로 로그인 테스트가 실패했습니다.

내가 사용하고 있습니다 :

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 

에는 사용자 지정 사용자 모델이 없습니다. 사용자 모델은 authtools.models.User입니다.

내보기 :

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" 

내 공장 :

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 

내 테스트는 두 가지 시험이 있습니다. 첫 번째 테스트는 클라이언트 로그인, 두 번째 테스트보기 :

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() 

테스트에 실패했습니다. 그러나 브라우저에서는 잘 작동합니다.

감사합니다.

답변

4

나는 스스로 대답한다. 해결책은 Model.objects.create() 함수에 대한 후크 호출 아래의 Factory_boy입니다. 사용자를 생성 할 때 auth 모델은 model.objects.create_user()를 호출합니다. 둘 다 작동!. 그러나 create_user는 비밀번호 암호화에 django.contrib.auth.hashers.make_password를 사용하고 funcntion save password를 일반 텍스트로 생성합니다. 그런 다음 솔루션입니다 :

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() 

그리고 공장

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