如何使用Factory_boy中的Faker

mar*_*nuy 17 python factory django-testing faker factory-boy

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

Factory_boy文档建议使用factory.Faker及其提供者:

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

    first_name = factory.Faker('first_name')
Run Code Online (Sandbox Code Playgroud)

但这不会产生任何名称:

>>> import factory
>>> factory.Faker('name')
<factory.faker.Faker object at 0x7f1807bf5278>
>>> type(factory.Faker('name'))
<class 'factory.faker.Faker'>
Run Code Online (Sandbox Code Playgroud)

factory_boy faker.pyfactory.Faker('ean', length=10)调用,faker.Faker.ean(length=10)Faker文档说它应该显示一个名称:

from faker import Faker
fake = Faker()
fake.name()
# 'Lucy Cechtelar'
Run Code Online (Sandbox Code Playgroud)

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

from faker import Factory
fake = Factory.create()
fake.name()
Run Code Online (Sandbox Code Playgroud)

小智 13

你可以使用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
Run Code Online (Sandbox Code Playgroud)

所以你需要用factory_boy实例化一个用户,它会为你调用Faker.

我不知道您是否尝试使用Django,但如果您希望工厂将创建的用户保存到数据库,则需要扩展factory.django.DjangoModelFactory而不是factory.Factory.

  • 你只是重复了OP已经知道的事情。也许我误解了这里的事情,因为你有 25 票 ^^ (2认同)

x-y*_*uri 7

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

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

import factory
print(factory.Faker('random_int').generate({}))
Run Code Online (Sandbox Code Playgroud)

_get_faker()

print(factory.Faker._get_faker().random_int())
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,这在后来的 Faker 版本中不再起作用。 (2认同)
  • @jaywink 好,更新了答案。 (2认同)

dom*_*ino 6

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

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

  • 这是我提问时想知道的。 (2认同)
  • 我认为 `fromfactory.faker import faker` 与 [`import faker`](https://github.com/FactoryBoy/factory_boy/blob/v2.9.0/factory/faker.py#L22) 没有什么不同。从可重复性的角度来看,我认为最好使用“factory_boy”本身创建的实例。 (2认同)