如何用FactoryBoy调用模型工厂方法而非__init__创建实例?
使用FactoryBoy为自定义静态工厂方法的类编写工厂类
当然可以实现,只需要重写FactoryBoy工厂类的_create类方法,指定调用目标类的静态工厂方法from_str即可。
步骤说明
- 先修正原
MyClass的__init__方法(原代码缺少self参数,属于语法错误):
class MyClass: def __init__(self): self.field = None self.is_valid = False @staticmethod def from_str(arg): inst = MyClass() inst.field = arg inst.is_valid = True return inst
- 编写FactoryBoy工厂类,重写
_create方法:
import factory class MyClassFactory(factory.Factory): class Meta: model = MyClass # 定义静态方法所需的参数,可使用Faker生成随机值或固定值 arg = factory.Faker('word') @classmethod def _create(cls, model_class, **kwargs): # 调用目标类的静态工厂方法创建实例 return model_class.from_str(kwargs.pop('arg'))
使用示例
# 生成带随机arg的实例 random_instance = MyClassFactory() print(random_instance.field) # 输出随机单词 print(random_instance.is_valid) # 输出True # 生成自定义arg的实例 custom_instance = MyClassFactory(arg="my_custom_string") print(custom_instance.field) # 输出"my_custom_string"
原理说明
FactoryBoy默认通过调用模型类的__init__方法创建实例,重写_create方法后,我们可以替换为任意自定义的实例创建逻辑——这里就是调用from_str静态方法。工厂中定义的arg字段会作为参数传入_create的kwargs,供静态方法使用。
内容的提问来源于stack exchange,提问作者Ibolit
相关产品推荐
相关产品推荐

