lazy_attribute的factoryboy覆盖属性

问题描述 投票:0回答:1

我有一些嵌套的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有一个运行失败的例子

谢谢您的任何建议!

python factory-boy
1个回答
0
投票

最好的方法是将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

© www.soinside.com 2019 - 2024. All rights reserved.