emi*_*der 6 python django unit-testing factory-boy
在FactoryBoy中定义ModelFactory时,我需要访问SubFactory创建的另一个模型的属性,并将其分配给此ModelFactory的属性.
这就是我想要做的:
import factory
class MyModelFactory(factory.DjangoModelFactory):
FACTORY_FOR = MyModel
created_by = factory.SubFactory(AdminUserFactory)**.id**
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,因为没有AdminUser对象来访问MyModelFactory类定义中的id.
这就是我所做的,但它很难看:
import factory
class MyModelFactory(factory.DjangoModelFactory):
FACTORY_FOR = MyModel
dummy_created_by = factory.SubFactory(AdminUserFactory)
created_by = factory.LazyAttribute(lambda o: o.dummy_created_by.id)
@classmethod
def _create(cls, target_class, *args, **kwargs):
del kwargs['dummy_created_by']
return super(MyModelFactory, cls)._created(
target_class, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我试图通读Factory_Boy文档,但没有看到允许我懒惰地访问该属性的类或函数.有没有人有什么建议?
从 factoryboy 2.4.0 开始,您可以使用exclude。这使您可以向工厂添加一个不会传递到模型类的参数
import factory
class MyModelFactory(factory.DjangoModelFactory):
created_by = factory.SubFactory(AdminUserFactory)
created_by_id = factory.LazyAttribute(lambda o: o.created_by.id)
class Meta:
model = MyModel
exclude = ['created_by']
Run Code Online (Sandbox Code Playgroud)
我已经将 OP 示例转移到使用,created_by_id但您可以重命名它以对您有意义。
class MyModelFactory(factory.django.DjangoModelFactory):
FACTORY_FOR = MyModel
dummy_created_by = factory.SubFactory(AdminUserFactory)
created_by = factory.SelfAttribute('dummy_created_by.id')
Run Code Online (Sandbox Code Playgroud)
kle*_*len -2
尝试使用混合器:
from mixer.backend.django import mixer
mixer.blend(MyModel, created_by=lambda: mixer.blend(AdminUser).id)
Run Code Online (Sandbox Code Playgroud)