【问题标题】:How to use Faker from Factory_boy如何使用 Factory_boy 的 Faker
【发布时间】: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()

【问题讨论】:

    标签: python django factory faker factory-boy


    【解决方案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')...
    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 2015-04-06
    • 1970-01-01
    • 2013-03-15
    • 2015-12-04
    • 1970-01-01
    • 2023-03-03
    • 2020-06-13
    相关资源
    最近更新 更多