Как создать поле со списком экземпляров в factory_boy

Я использую Factory Boy для тестирования некоторых моделей (не Django), и мне было интересно, как я могу отобразить поле, содержащее список с несколькими экземплярами другой фабрики. Например, с предложениями Пользователь и Группа:

class User:
  name = StringType(required=True)

class Group:
  name = StringType(required=True)
  user = ModelType(User)

Я хотел бы отобразить поле с именем groups в фабрике пользователей, которое содержит все группы, к которым принадлежит такой пользователь. Отображение двух групп по умолчанию ['group1', 'group2'] при запуске фабрики.

class UserFactory:
    name = factory.Faker('first_name')
    groups = factory.RelatedFactory(GroupFactory, 'user')

    class Meta:
        model = User


class GroupFactory:
    name = factory.Faker('word')
    user = factory.SubFactory(UserFactory)

    class Meta:
        model = Group

Я попытался использовать связанную фабрику, как показано выше, но я не знаю, как определить значения по умолчанию для связанных полей. Есть ли какой-нибудь гуру-фабрикант, который может пролить свет на этот вопрос?

1 ответ

Это упомянуто в части общих рецептов документации фабричного мальчика: http://factoryboy.readthedocs.io/en/latest/recipes.html

Если вы создаете свой UserFactory, как в документации, вы можете предоставить группы при использовании UserFactory:

class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.User

    name = "John Doe"

    @factory.post_generation
    def groups(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of groups were passed in, use them
            for group in extracted:
                self.groups.add(group)

Вы можете использовать это так:

group1 = GroupFactory()
UserFactory.create(groups=[group1,])

Если вы хотите предоставить группы по умолчанию для каждого пользователя, созданного на фабрике, вы можете добавить предложение else в if:

@factory.post_generation
def groups(self, create, extracted, **kwargs):
    if not create:
        # Simple build, do nothing.
        return

    if extracted:
        # A list of groups were passed in, use them
        for group in extracted:
            self.groups.add(group)
    else:
        self.groups.add(GroupFactory(name='default group 1'))

Пример в документации использует Django, поэтому я использовал его и в ответе.

Другие вопросы по тегам