【问题标题】:User authentication in tests with Django factory_boyDjango factory_boy 测试中的用户身份验证
【发布时间】:2012-04-17 00:48:47
【问题描述】:

当尝试对我的代码的某些部分进行单元测试时,我需要一个用户登录。为了减少我正在使用 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 而不是用户。关于这里缺少什么的任何想法?

【问题讨论】:

    标签: django unit-testing factory django-authentication


    【解决方案1】:

    @Andrew-Magee 解决方案有效,但这里的解决方案 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 = 'test@example.com'
        password = factory.PostGenerationMethodCall('set_password', 'password')
    

    Django 控制台:

    >>> from tests.factories import UserFactory
    >>> from django.contrib.auth.models import check_password
    >>> user = UserFactory()
    >>> user.email
    'test@example.com'
    >>> check_password('password', user.password)
    True
    
    >>> user2 = UserFactory(username="SecondUserFactory", email='otheremail@example.com', password="ComplexPasswordMuchLonger!")
    >>> user2.email
    'otheremail@example.com'
    >>> check_password('ComplexPasswordMuchLonger!', user2.password)
    True
    

    【讨论】:

    【解决方案2】:

    另一种方法:

    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%s@example.com" % n)
        username = factory.Sequence(lambda n: "email%s@example.com" % 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
    

    【讨论】:

      【解决方案3】:

      你应该在user.set_password()之后调用user.save(),因为set_password本身不保存用户,只设置数据。

      【讨论】:

      • 谢谢!我终于找到了解决方案,但由于我的声誉低,无法回复自己。
      猜你喜欢
      • 2015-08-18
      • 2013-02-04
      • 1970-01-01
      • 2014-05-04
      • 2010-12-23
      • 2015-06-01
      • 2018-07-04
      • 2022-11-02
      相关资源
      最近更新 更多