30

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()
4

4 回答 4

27

您可以像这样将 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。

于 2016-08-02T12:15:47.087 回答
21

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

>>> from factory.faker import faker
>>> FAKE = faker.Faker()
>>> FAKE.name()
'Scott Rodriguez'
>>> FAKE.address()
'PSC 5061, Box 1673\nAPO AP 53007'
>>>
于 2019-01-22T10:29:54.620 回答
8

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

您可以查看其他答案以获取更详细的示例。

于 2019-04-06T12:29:25.010 回答
4

首先,如果你想factory_boy与 Django 模型一起使用,你应该DjangoModelFactory按照推荐的方式使用。

其次,factory_boy建议使用Faker属性声明,以便轻松定义逼真的工厂。(见供应商

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
于 2020-07-25T23:14:58.823 回答