我有以下工厂:
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
答案 0 :(得分:0)
您正在使用自动生成的模型灯具。来自docs
子工厂属性指向子工厂的模型夹具。子工厂的属性作为依赖关系注入模型夹具,可以通过参数化覆盖。
因此模型夹具pro_profile
和user_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
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_factory
和pro_profile_factory
,因为它们最容易推理。