Как использовать Faker из Factory_boy

Factory_boy использует fake-factory (Faker) для генерации случайных значений, я хотел бы генерировать некоторые случайные значения в своих тестах Django напрямую с помощью Faker.

Factory_boy docs предлагает использовать factory.Faker и его поставщика как:

class RandomUserFactory(factory.Factory):
    class Meta:
        model = models.User

    first_name = factory.Faker('first_name')

Но это не генерирует никакого имени:

>>> import factory
>>> factory.Faker('name')
<factory.faker.Faker object at 0x7f1807bf5278>
>>> type(factory.Faker('name'))
<class 'factory.faker.Faker'>

От Factory_boy faker.py class factory.Faker('ean', length=10) вызывает faker.Faker.ean(length=10), но Faker docs говорит, что он должен показывать имя:

from faker import Faker
fake = Faker()
fake.name()
# 'Lucy Cechtelar'

Есть ли другой способ использовать Faker вместо установки экземпляра непосредственно из Faker?

from faker import Factory
fake = Factory.create()
fake.name()

Ответ 1

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

>>> from factory.faker import faker
>>> FAKE = faker.Faker()
>>> FAKE.name()
'Scott Rodriguez'
>>> FAKE.address()
'PSC 5061, Box 1673\nAPO AP 53007'
>>>

Ответ 2

Вы можете использовать faker с factory_boy следующим образом:

class RandomUserFactory(factory.Factory):
    class Meta:
        model = models.User

    first_name = factory.Faker('first_name')

user = RandomUserFactory()

print user.first_name
# 'Emily

Итак, вам нужно создать экземпляр пользователя с помощью factory_boy, и он вызовет Faker для вас.

Я не знаю, пытаетесь ли вы использовать это с Django или нет, но если вы хотите, чтобы factory сохранил созданного пользователя в базе данных, то вам нужно расширить factory.django.DjangoModelFactory вместо factory.Factory.

Ответ 3

Немного проще использовать недокументированный метод generate():

import factory
print(factory.Faker('random_int').generate({}))

или _get_faker():

print(factory.Faker._get_faker().random_int())

Вы можете проверить другой ответ для более подробного примера.