2012-04-17 46 views
5

私のコードのユニットテストを行う際には、ログインする必要があります。フィクスチャの数を減らすために、django_factory_boyユーザファクトリを使用していますが、ユーザが認証できません。Djangoでのテストでのユーザ認証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.set_password()の後に電話する必要があります。

+0

ありがとうございます!私は最終的に解決策を見つけましたが、私の低い評判のために自分自身に返答できませんでした。 – sebastibe

8

それを行うための別の方法は:アンドリュー・マギー・ソリューション@

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 
7

は動作しますが、ここでは解決策describe in the doc

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

Djangoのコンソール:

>>> 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 
+1

私はまたこの解決策を好む。 [factory_boy documentation](https://factoryboy.readthedocs.org/en/latest/reference.html#factory.PostGenerationMethodCall)に明記されています – Merwan

+0

@Merwanに感謝、私は私の投稿を編集しました –

関連する問題