【问题标题】:how to generate a subfactory based on condition of a parent attribute如何根据父属性的条件生成子工厂
【发布时间】:2021-01-11 14:49:10
【问题描述】:

我有这样的工厂:

class PayInFactory(factory.DjangoModelFactory):
    class Meta:
        model = PayIn
  
    @factory.lazy_attribute
    def card(self):
        if self.booking_payment and self.booking_payment.payment_type in [bkg_cts.PAYMENT_CARD, bkg_cts.PAYMENT_CARD_2X]:
            factory.SubFactory(
                CardFactory,
                user=self.user,
            )

仅当booking_payment 字段在[bkg_cts.PAYMENT_CARD, bkg_cts.PAYMENT_CARD_2X] 中具有payment_type 值时,我才尝试生成字段card

代码进入该语句,但生成后卡片字段为空。

我怎样才能正确地做到这一点? SubFactory 是否允许在 lazy_attribute 中使用?

如果可能的话,我希望能够像这样修改 PayInFactory 中的 Card 字段:

>>> PayInFactory(card__user=some_user)

PostGeneration 不会这样做,因为我需要这个 Card 在调用创建之前可用。我覆盖了_create,如果可用,它可能会使用该卡。

谢谢!

【问题讨论】:

    标签: factory-boy


    【解决方案1】:

    解决方法在于factory.Maybe:

    class PayInFactory(factory.django.DjangoModelFactory):
        class Meta:
            model = models.PayIn
    
        card = factory.Maybe(
            factory.LazyAttribute(
                lambda o: o.booking_payment and o.booking_payment.payment_type in ...
            ),
            factory.SubFactory(
                CardFactory,
                # Fetch 'user' one level up from CardFactory: PayInFactory
                user=factory.SelfAttribute('..user'),
            ),
        )
    

    但是,我还没有测试额外的参数是否实际传递给CardFactory,也没有测试CardFactory 没有被调用时会发生什么——你必须检查(如果如果你得到一个意想不到的行为!)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-21
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2011-12-08
      • 1970-01-01
      • 2019-05-30
      相关资源
      最近更新 更多