如何使用 Factory_boy 的 Faker

Posted

技术标签:

【中文标题】如何使用 Factory_boy 的 Faker【英文标题】:How to use Faker from Factory_boy 【发布时间】:2016-12-05 20:43:37 【问题描述】:

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.pyfactory.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()

【问题讨论】:

【参考方案1】:

你可以像这样在 factory_boy 中使用 faker:

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。

【讨论】:

您只是重复了 OP 已经知道的内容。也许我误解了这里的事情,因为你有 25 票 ^^ @NamGVU 我确实重复了这门课,但最后两行显示了如何通过 Factory 生成假数据,而不是直接使用 faker 库。【参考方案2】:

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

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

【讨论】:

这是我问问题时想知道的。 我认为from factory.faker import fakerimport faker 没有什么不同。从重现性的角度来看,我认为最好使用factory_boy 本身创建的实例。 我同意@x-yuri - 这与factoryboy的内心Faker无关【参考方案3】:

UPD您通常应该更喜欢two 其他answers 之一,因为这个使用私有接口,而generate() 解决方案仅适用于factory-boy&lt;3.1.0

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

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

_get_faker():

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

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

【讨论】:

不幸的是,这在以后的 Faker 版本中不再有效。 在我看来这应该是公认的答案。【参考方案4】:

首先,如果你想在 Django 模型中使用 factory_boy,你应该使用 DjangoModelFactory,因为它是 recommended。

其次,factory_boy 也可以suggests 使用Faker 属性声明,以便轻松定义逼真的工厂。 (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

【讨论】:

如果你使用LazyAttribute,你会怎么做?例如。 factory.LazyAttribute(lambda a: factory.Faker('sentence')...

以上是关于如何使用 Factory_boy 的 Faker的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Laravel 工厂使用自定义值列表,维护订单并仍在使用 Faker 外观?

使用python的faker库和dataclass快速生成测试数据

如何使用 faker 生成数组(每行)?

如何在yii2的预先模板中使用faker

python faker 生成随机类型字符串

python3 测试的时候如何批量随机生成伪数据?(faker模块的)