2012-04-17 6 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

Вы должны позвонить по номеру user.save() после user.set_password(), так как 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

@ решение Andrew-Маги работает, но здесь решение 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') 

Джанго консоль:

>>> 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, я отредактировал мой пост –

Смежные вопросы