атрибут переопределения фабричного объекта lazy_attribute - PullRequest
0 голосов
/ 11 января 2020

У меня есть несколько вложенных объектов google.proto.message, и я пытаюсь переопределить атрибут глубоко внутри родительской модели при создании тестовых данных с помощью factoryboy. Некоторые дочерние сообщения создаются с помощью lazy_attribute, который содержит лог c для заполнения их другими объектами. Я воспроизвел проблему, которая возникла у меня в factoryboy, на гораздо более простом примере с использованием attrs моделей.

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

Спасибо за любые ваши предложения!

1 Ответ

1 голос
/ 13 января 2020

Лучше всего было бы использовать 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.

...