【问题标题】:factoryboy override attribute of lazy_attribute工厂男孩覆盖lazy_attribute的属性
【发布时间】:2020-01-11 18:38:56
【问题描述】:

我有一些嵌套的 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】:

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

    【讨论】:

    • 公平地说,一般factory.lazy_attribute 适用于标量或标量列表的属性,但这是(其中之一?)与属性一起使用时的缺点可以由 SubFactory 生成?
    • 嗯,主要区别在于lazy_attribute只能从实际对象中获取参数;更复杂的声明(SubFactoryRelatedFactory)也接受带有 x__y 表示法的附加参数。
    【解决方案2】:

    您可以使用 post_generation 方法来控制创建的项目数量以及底层模型的属性。

    class BookFactory(factory.Factory):
      class Meta:
        model = models.Book
    
    @factory.post_generation
    def pages(self, create, extracted, **kwargs):
        if not create:
            return
        num_pages = kwargs.get('num_pages', 0)
        if num_pages > 0:
            book.pages = <---code goes here--->
    
    book = BookFactory.build(
      pages__num_pages=3,
      pages__0__content='mypage0',
    )
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @Flair - 添加示例代码以替换链接 - 感谢您的反馈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2015-10-26
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多