如何使用Factory_boy中的Faker

时间:2016-07-31 19:07:10

标签: 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')

但这并没有产生任何名称:

>>> 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 个答案:

答案 0 :(得分: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

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

我不知道你是否试图将它与Django一起使用, 但是如果您希望工厂将创建的用户保存到数据库, 那么你需要扩展factory.django.DjangoModelFactory而不是factory.Factory。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

一种更简单的方法是使用未公开的generate()方法:

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

_get_faker()

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

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

答案 3 :(得分:0)

首先,如果要将created() { const originalPush = this.myarray.push; const originalSplice = this.myarray.splice; this.myarray.push = (...args) => { //do something with args return originalPush.apply(this.myarray, args); }; this.myarray.splice = (...args) => { //do something with args return originalSplice.apply(this.myarray, args); }; //any more array methods you want to intercept }, 与Django模型一起使用,则应按原样使用recommendedfactory_boy

第二,DjangoModelFactorysuggests使用factory_boy属性声明,以便轻松定义外观逼真的工厂。 (see providers

Faker

一旦定义了工厂,就可以按如下所示简单使用它:

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

    first_name = factory.Faker('first_name')