如何使用 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.py
类factory.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 faker
与import faker
没有什么不同。从重现性的角度来看,我认为最好使用factory_boy
本身创建的实例。
我同意@x-yuri - 这与factoryboy的内心Faker无关【参考方案3】:
UPD您通常应该更喜欢two 其他answers 之一,因为这个使用私有接口,而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())
您可以查看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 外观?