【问题标题】:How can I set User Groups using factory_boy如何使用 factory_boy 设置用户组
【发布时间】:2015-04-06 16:55:57
【问题描述】:

我对 Django 还很陌生。我正在尝试使用factory_boyUser 设置groups 字段。默认的User 类有一个字段_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

【问题讨论】:

    标签: django django-testing factory-boy


    【解决方案1】:

    下面的代码使用了标准的 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)
    

    测试

    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)
    

    【讨论】:

      【解决方案2】:

      由于GroupUser 具有ManyToManyField 关系,因此您不能使用SubFactory(仅适用于ForeignKey 字段):使用SubFactoryfactory_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),
            ])
      

      【讨论】:

      • Xelnor:我没有在Users 模型中明确定义groups 字段。我收到错误'groups' is an invalid keyword argument for this function 。我已经被困了很长时间了。
      猜你喜欢
      • 2013-03-15
      • 2016-12-05
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      相关资源
      最近更新 更多