Factory Boy - связывают две субфабрики - PullRequest
0 голосов
/ 06 мая 2018

Скажем, у меня есть фабрика с двумя подзаводами, которые должны быть связаны. Какие ловушки (ы) предоставляет FactoryBoy для генерации до / после генерации, чтобы связать эти подфабрики?

class AppointmentFactory(factory.DjangoModelFactory):
    class Meta:
        model = Appointment

    team_member = factory.SubFactory(TeamMemberFactory)
    merchant_location = factory.SubFactory(MerchantLocationFactory)

Проверка того, что создается в сеансе оболочки, дает теоретически недопустимый объект - члена команды из другого места.

> appt = AppointmentFactory.create()
>
> print(appt.merchant_location)
> <MerchantLocation: object (3)>
>
> print(appt.team_member.merchant_location) 
> <MerchantLocation: object (4)>

В идеале этот хук дал бы мне доступ к аргументам, передаваемым на фабрику, чтобы я мог определить, какой SubFactory использовать в качестве «источника правды» для отношений.

Пример логики:

   # handle: AppointmentFactory(team_member=tm_A) or AppointmentFactory(location=loc_A)

   @factory.my_desired_hook
   def associate_stuff(self, *args, **kwargs):
       if 'team_member' in kwargs and 'merchant_location' in kwargs:
           pass . # assume caller taking responsibility for correctness
       elif 'team_member' in kwargs:
           self.merchant_location = team_member.merchant_location
       elif 'merchant_location' in kwargs:
           self.team_member.merchant_location = self.merchant_location

1 Ответ

0 голосов
/ 06 мая 2018

Лучшим способом для этого было бы использовать factory.SelfAttribute в вашем подфактории:

class AppointmentFactory(factory.Factory):
    class Meta:
        model = Appointment

    merchant_location = factory.SubFactory(MerchantLocationFactory)
    team_member = factory.SubFactory(
        TeamMemberFactory,
        # Fetch the `merchant_location` from the parent object.
        merchant_location=factory.SelfAttribute('..merchant_location'),
    )

Это не относится к возможности предоставления, и заводская настройка выполняется автоматически. Эта часть более сложная, поскольку библиотека не предоставляет помощников для разрыва циклической зависимости.

...