2012-04-17 20 views
5

Khi thử đơn vị kiểm tra một phần mã của tôi, tôi cần người dùng đăng nhập. Để giảm số lượng đồ đạc tôi đang sử dụng django_factory_boy Nhà máy người dùng nhưng Người dùng tạo không thể xác thực .Xác thực người dùng trong các thử nghiệm với Django factory_boy

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

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

sau đó authenticate(username=user.username, password='password') trả lại None thay vì người dùng. Bất kỳ ý tưởng về những gì còn thiếu ở đây?

Trả lời

3

Bạn nên gọi user.save() sau user.set_password() vì bản thân set_password không lưu người dùng, chỉ đặt dữ liệu.

+0

Cảm ơn bạn! Cuối cùng tôi đã tìm ra giải pháp nhưng không thể trả lời cho bản thân vì danh tiếng thấp của tôi. – sebastibe

8

Một cách khác để làm điều đó:

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-Magee giải pháp hoạt động, nhưng đây là giải pháp 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 console:

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

Tôi cũng thích giải pháp này. Nó được ghi rõ trong [tài liệu factory_boy] (https://factoryboy.readthedocs.org/en/latest/reference.html#factory.PostGenerationMethodCall) – Merwan

+0

cảm ơn bạn @Merwan, tôi đã chỉnh sửa bài đăng của mình –

Các vấn đề liên quan