6

コードの一部を単体テストしようとすると、ユーザーがログインする必要があります。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ます。ここに欠けているものについて何かアイデアはありますか?

4

3 に答える 3

10

@ Andrew-Mageeソリューションは機能しますが、ここでソリューションはドキュメントに記載されています:

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
于 2013-12-15T09:29:55.070 に答える
9

それを行う別の方法:

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
于 2013-07-09T07:15:46.387 に答える
4

それ自体はユーザーを保存せず、データを設定するだけなのでuser.save()、後で呼び出す必要があります。user.set_password()set_password

于 2012-04-17T03:55:06.993 に答える