Saš*_*aba 5 python testing django pytest factory-boy
在 Django 中使用 factory_boy 时,我该如何实现?
模型.py
class TestModel(models.Model):
name = CharField()
order = IntegerField()
Run Code Online (Sandbox Code Playgroud)
食谱.py
class TestModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = TestModel
name = factory.LazyAttribute(lambda o: faker.word().title())
order = 0
Run Code Online (Sandbox Code Playgroud)
测试.py
recipes.TestModelFactory.create_batch(4, order=+10)
Run Code Online (Sandbox Code Playgroud)
或者
recipes.TestModelFactory.create_batch(4, order=seq(10))
Run Code Online (Sandbox Code Playgroud)
或类似的东西,以达到这个结果:
TestModel.objects.all().values_list('order', flat=True)
[10, 20, 30, 40]
Run Code Online (Sandbox Code Playgroud)
更新
Ty @trinchet 的想法。所以我想一种解决方案是:
class TestModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = TestModel
name = factory.LazyAttribute(lambda o: faker.word().title())
order = factory.Sequence(lambda n: n * 10)
Run Code Online (Sandbox Code Playgroud)
但这总是会在我的所有对象上设置序列,而我无法设置我想要的值。
一种解决方法是:
class TestModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = TestModel
name = factory.LazyAttribute(lambda o: faker.word().title())
order = 0
Run Code Online (Sandbox Code Playgroud)
然后在测试中:
recipes.MenuItemFactory.reset_sequence(1)
recipes.MenuItemFactory.create_batch(
4,
parent=self.section_menu,
order=factory.Sequence(lambda n: n * 10)
)
Run Code Online (Sandbox Code Playgroud)
这会给我我想要的结果。但这会重置所有序列。我希望它能够为订单动态设置序列。
以防万一有人觉得它有帮助。
我发现这篇文章试图实现负排序顺序。并且仅在 create_batch 调用中。所以我的用例是
MyModelFactory.create_batch(
9,
sort_order=factory.Sequence(lambda n: 10-n))
Run Code Online (Sandbox Code Playgroud)