如何使用factory_boy设置用户组

Shu*_*ham 3 django django-testing factory-boy

我是Django的新手.我正在尝试设置使用的groups字段.默认类有一个字段.我尝试过设置,但这没有帮助.Userfactory_boyUser_groups

class GroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Group

    name = Sequence(lambda n: "group_{0}".format(n))


class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = User

    username = factory.Sequence(lambda n: "user_{0}".format(n))
    password = "test"
    first_name = u'ßhamra'
    last_name = u'ßhamra'
    _groups = factory.SubFactory(GroupFactory)


    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        """
        Override the default ``_create`` with our custom call.
        Due to internal behavior or create user create method that                forces is_staff kwarg


    """
    g = GroupFactory("abc")
    manager = cls._get_manager(model_class)
    is_staff = kwargs.pop('is_staff', None)
    user = manager.create_user(*args, **kwargs)


    if is_staff:
        user.is_staff = is_staff
        user.save()
    return user
Run Code Online (Sandbox Code Playgroud)

Mic*_*elB 7

下面的代码使用标准的django组.您必须使用工厂男孩后期生成来向用户添加组.

工厂

import factory
import django.contrib.auth.models as auth_models
from django.contrib.auth.hashers import make_password

user_password = 'password'

class SubscribedGroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = auth_models.Group

    name = 'subscribed'

class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = auth_models.User

    first_name = "Sophia"
    last_name = "Ball"
    username = "clowngirl@heaven.com"
    password = make_password(user_password)
    email = "clowngirl@heaven.com"
    is_active = True

    @factory.post_generation
    def groups(self, create, extracted, **kwargs):
        if not create:
            return

        if extracted:
            for group in extracted:
                self.groups.add(group)
Run Code Online (Sandbox Code Playgroud)

测试

from app.factories import UserFactory, SubscribedGroupFactory, user_password
class TestCenterTest(TestCase):

    def test_test_center_redirect(self):
        user = UserFactory.create(groups=(SubscribedGroupFactory.create(),))
        self.client.login(username=user.email, password=user_password)
        response = self.client.get('/test-center/')
        self.assertEqual(302, response.status_code)
Run Code Online (Sandbox Code Playgroud)


小智 0

由于Group与ManyToManyField相关User,因此您不能使用SubFactory(仅适用于ForeignKey字段):使用 a 时SubFactory,factory_boy将首先创建 ,Group然后将其传递给UserFactory将其用作 的User.objects.create(_groups=Group)。这行不通。

查看Recipes文档的部分:http://factoryboy.readthedocs.org/en/latest/recipes.html#simple-manytomany

在这里,以下代码应该可以工作:

  class UserFactory(factory.django.DjangoModelFactory):
      # All other declarations here

      groups = factory.List([
          factory.RelatedFactory(GroupFactory),
      ])
Run Code Online (Sandbox Code Playgroud)