我有一些嵌套的google.proto.message对象,并在使用factoryboy进行测试数据时尝试覆盖父模型内部的一个属性。一些子消息是使用lazy_attribute创建的,其中包含使用其他对象填充它们的逻辑。我用attrs
模型通过一个更简单的示例重现了我在factoryboy中遇到的问题。
class BookFactory(factory.Factory):
class Meta:
model = models.Book
class Params:
num_pages = 10
@factory.lazy_attribute
def pages(self):
return PageFactory.build_batch(self.num_pages)
book = BookFactory.build(
num_pages=3,
pages__0__content='mypage0',
)
# This fails. How do I override pages[0].content with a BookFactory attribute?
assert book.pages[0].content == 'mypage0'
我在https://repl.it/@TomGoBravo/lazyattributesubfactory有一个运行失败的例子
谢谢您的任何建议!
最好的方法是将SubFactory
包裹在factory.List
中,但是您将失去调整所述列表长度的能力:
class BookFactory(factory.Factory):
class Meta:
model = models.Book
pages = factory.List([
factory.SubFactory(PageFactory),
factory.SubFactory(PageFactory),
factory.SubFactory(PageFactory),
])
否则,您将必须实现(并做出贡献!)某种形式的SubFactoryList
,类似于现有的RelatedFactoryList
。