2012-04-17 4 views
5

내 코드의 일부분을 유닛 테스트하려고 할 때 사용자가 로그인해야합니다. 조명기 수를 줄이기 위해 django_factory_boy 사용자 팩토리를 사용하고 있지만 생성 된 사용자는 인증 할 수 없습니다 .장고와의 테스트에서 사용자 인증 factory_boy

from django_factory_boy.auth import UserF 
from django.contrib.auth import authenticate 

user = UserF() 
user.set_password('password') 

다음 authenticate(username=user.username, password='password') 반환하는 대신 사용자의 None. 여기에 실종 된 것에 대한 아이디어가 있습니까?

답변

3

set_password 그 자체가 사용자를 저장하지 않고 이후에 user.save()을 호출해야하며 데이터 만 설정해야합니다. 솔루션을 여기 describe in the doc

import factory 
from django.contrib.auth.hashers import make_password 
from somewhere import YourUserModel 

class UserF(factory.django.DjangoModelFactory): 
    FACTORY_FOR = YourUserModel 
    first_name = factory.Sequence(lambda n: "First%s" % n) 
    last_name = factory.Sequence(lambda n: "Last%s" % n) 
    email = factory.Sequence(lambda n: "email%[email protected]" % n) 
    username = factory.Sequence(lambda n: "email%[email protected]" % n) 
    password = make_password("password") 
    is_staff = False 

>>> u = UserF.create() 
>>> u.check_password("password") 
True 

>>> p = UserF.create(password=make_password("password2")) 
>>> p.check_password("password2") 
True 
+0

감사합니다! 마침내 해결책을 찾았지만 저의 평판 때문에 나 자신에게 대답 할 수 없었습니다. – sebastibe

8

또 다른 방법은 그것을 할 수

import factory 
from django.contrib.auth.models import User 
#or 
#from somewhere import CustomUser as User 

class UserFactory(factory.DjangoModelFactory): 
    FACTORY_FOR = User 

    username = 'UserFactory' 
    email = '[email protected]' 
    password = factory.PostGenerationMethodCall('set_password', 'password') 

장고 콘솔 :

>>> from tests.factories import UserFactory 
>>> from django.contrib.auth.models import check_password 
>>> user = UserFactory() 
>>> user.email 
'[email protected]' 
>>> check_password('password', user.password) 
True 

>>> user2 = UserFactory(username="SecondUserFactory", email='[email protected]', password="ComplexPasswordMuchLonger!") 
>>> user2.email 
'[email protected]' 
>>> check_password('ComplexPasswordMuchLonger!', user2.password) 
True 
7

앤드류-Magee의 솔루션이 작동 @ :하지만

+1

나는 또한이 해결책을 선호한다. [factory_boy documentation] (https://factoryboy.readthedocs.org/en/latest/reference.html#factory.PostGenerationMethodCall)에 명확하게 설명되어 있습니다. – Merwan

+0

감사합니다. @Merwan, 내 게시물을 편집했습니다. –