如何防止FactoryBoy重用SubFactory的对象?

时间:2017-11-18 14:50:32

标签: django testing factory-boy django-1.11

我有以下工厂:

text/html

当我同时注入专业和用户个人资料时,他们与同一个用户关联:

class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = get_user_model()


class ProProfileFactory(factory.DjangoModelFactory):
    user = factory.SubFactory(UserFactory)
    class Meta:
        model = ProfessionalProfile


class UserProfileFactory(factory.DjangoModelFactory):
    user = factory.SubFactory(UserFactory)
    class Meta:
        model = UserProfile

此测试失败。

如何让工厂男孩为每个个人资料创建新用户?

我使用的是Django 1.11,pytest 3.2.2,pytest-django 3.1.2,pytest-factoryboy 1.3.1

1 个答案:

答案 0 :(得分:0)

您正在使用自动生成的模型灯具。来自docs

  

子工厂属性指向子工厂的模型夹具。子工厂的属性作为依赖关系注入模型夹具,可以通过参数化覆盖。

因此模型夹具pro_profileuser_profile都使用模型夹具user。因此他们是一样的。我也没想到会出现这种情况,所以我测试了一些选项

覆盖工厂(如在文档中)

@pytest.mark.parametrize('user_profile__user',
                         [LazyFixture(lambda user_factory: user_factory())])
def test_should_create_project(professional_profile, user_profile):
    assert user_profile.user != professional_profile.user

只需使用工厂灯具

def test_should_create_project_1(professional_profile_factory, user_profile_factory):
        user_profile = user_profile_factory()
        professional_profile = professional_profile_factory()
        assert user_profile.user != professional_profile.user

在注册期间更改subfactory

register(ProProfileFactory, 'pro_profile_2',
         user=LazyFixture(lambda user_factory: user_factory()))

def test_should_create_project_2(pro_profile_2, user_profile):
    assert user_profile.user != pro_profile_2.user

使用部分专业化(对我不起作用)

# oddly, this fails for me, partial specialization
register(ProProfileFactory, 'pro_profile_3')
register(UserFactory, 'another_user')

@pytest.fixture
def pro_profile_3__user(another_user):
    return another_user

# This fails
def test_should_create_project_3(pro_profile_3, user_profile):
    assert user_profile.user != pro_profile_3.user

我认为最简单的方法就是使用工厂灯具user_profile_factorypro_profile_factory,因为它们最容易推理。