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_boy
也suggests 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})
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 您通常应该更喜欢 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_boy
也suggests 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})