Как создать поле со списком экземпляров в 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, поэтому я использовал его и в ответе.