Factory_boy 如何使用 Faker

How to use Faker from Factory_boy

Factory_boy 使用 fake-factory (Faker) 生成随机值,我想在我的 Django 测试中直接使用 Faker 生成一些随机值。

Factory_boy 文档建议使用 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 文档说它应该显示一个名称:

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

有没有其他方法可以使用 Faker 而不是直接从 Faker 设置实例?

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

你可以像这样将 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.django.DjangoModelFactory 而不是 factory.Factory.

我知道这是一个老问题,但对于可能遇到此问题的任何人来说,这是您可以使用的另一种方法。

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

UPD 您通常应该更喜欢 other 之一,因为这个使用私有接口,而 generate() 解决方案仅适用于 factory-boy<3.1.0.

更简单一点的方法是使用未记录的 generate() 方法 (factory-boy<3.1.0):

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

_get_faker():

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

您可以查看 以获得更详细的示例。

首先,如果您想将 factory_boy 与 Django 模型一起使用,您应该按原样使用 DjangoModelFactory recommended

其次,factory_boysuggests to use Faker attribute declaration in order to easily define realistic-looking factories. (see providers)

class RandomUserFactory(factory.DjangoModelFactory):
    class Meta:
        model = 'myapp.User'  # Equivalent to model = myapp.models.User

    first_name = factory.Faker('first_name')

定义工厂后,您可以按如下方式简单地使用它:

>>> o = RandomUserFactory()
>>> o.first_name
Tim

正如其他答案已经阐明的那样,proper/usual 使用 Faker 的方法是使用工厂。然而,偶尔使用 Faker inline 是有用的,这似乎是这里的根本问题。

这是 2022 和最新 factoryboy 版本的更新答案:

from typing import Any

from factory import Faker


def get_fake(provider: str, locale: str | None = None) -> Any:
     """ e.g. `get_fake('name')` ==> 'Buzz Aldrin' """
    if not locale:
        locale = Faker._DEFAULT_LOCALE  # pylint: disable=protected-access
    return Faker(provider).evaluate({}, None, {'locale': locale})