2012-04-17 38 views
5

Kod testinin bir kısmını denemeye çalışırken, giriş yapmam gereken bir kullanıcıya ihtiyacım var. Armatür sayısını azaltmak için django_factory_boy Kullanıcı fabrikasını kullanıyorum ancak oluşturulan Kullanıcı kimlik doğrulaması yapamıyor .Django ile testlerde kullanıcı kimlik doğrulaması factory_boy

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

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

sonra authenticate(username=user.username, password='password') dönüş yerine Kullanıcının None. Burada neyin eksik olduğu hakkında bir fikrin var mı?

cevap

3

user.set_password()'dan sonra user.save()'u aramanız gerekir çünkü set_password kullanıcının kendisini kaydetmez, yalnızca verileri ayarlar. Çözüm burada 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

teşekkür ederiz! Sonunda çözümü buldum ama düşük itibarımdan dolayı kendime cevap veremedim. – sebastibe

8

bir başka yolu bunu yapmak için

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 konsolu:

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

Andrew-Magee çözüm çalışır @ ama:

+1

Ayrıca bu çözümü tercih ediyorum. Bu açıkça [factory_boy belgelerinde] belgelenmiştir (https://factoryboy.readthedocs.org/en/latest/reference.html#factory.PostGenerationMethodCall) – Merwan

+0

@Merwan teşekkür ederim, yazımı düzenledim –

İlgili konular