如何用factory_boy创建调用自定义函数的工厂(非SubFactory)
直接调用自定义函数的工厂实现(非SubFactory方式)
假设你使用的是Factory Boy库,要创建一个直接调用现有生成函数的工厂,核心是重写工厂的_create方法,或者用LazyFunction包装你的函数,下面是具体实现方式:
基础实现(无参数传递)
如果你的生成函数不需要额外参数,直接返回处理好关联的对象列表,可以这样定义工厂:
import factory # 你已实现的生成函数 def generate_complex_objects(): # 这里是你的业务逻辑,返回带关联的对象列表 obj1 = YourModel(name="obj1") obj2 = RelatedModel(parent=obj1, value=100) return [obj1, obj2] class ComplexObjectListFactory(factory.Factory): class Meta: model = list # 工厂生成的是列表类型 @classmethod def _create(cls, model_class, *args, **kwargs): # 直接调用你的生成函数并返回结果 return generate_complex_objects()
使用时直接实例化工厂即可:
object_list = ComplexObjectListFactory()
支持参数传递的实现
如果需要给生成函数传递自定义参数,只需在工厂中接收参数,再传给生成函数:
class ComplexObjectListFactory(factory.Factory): class Meta: model = list # 定义默认参数,可在实例化时覆盖 item_count = 2 @classmethod def _create(cls, model_class, *args, **kwargs): # 取出工厂参数,传递给生成函数 count = kwargs.get('item_count') return generate_complex_objects(count=count)
使用时可以指定参数:
# 用默认参数生成 default_list = ComplexObjectListFactory() # 传递自定义参数 custom_list = ComplexObjectListFactory(item_count=5)
另一种方式:使用LazyFunction
也可以用factory.LazyFunction来包装你的生成函数,简化工厂定义:
class ComplexObjectListFactory(factory.Factory): class Meta: model = list # 用LazyFunction直接关联生成函数 _result = factory.LazyFunction(generate_complex_objects) @classmethod def _create(cls, model_class, *args, **kwargs): return kwargs['_result']
这种方式适合不需要参数传递的场景,代码更简洁。
内容的提问来源于stack exchange,提问作者breadjesus
相关产品推荐
相关产品推荐

