3

我有一些使用faker(http://www.joke2k.net/faker/)进行单元测试的模型,它在shell中是随机的:

In [50]: get_random()
Out[50]: 22347376

In [51]: get_random()
Out[51]: 66840240

In [52]: import factory, random, time

In [53]: from factory import DjangoModelFactory, lazy_attribute

In [54]: from faker import Faker

In [55]: FAKER = Faker(locale='en_US')

In [60]: FAKER.email()
Out[60]: u'anderson.meaghan@jonesharvey.org'

In [61]: FAKER.seed(get_random())

In [62]: FAKER.email()
Out[62]: u'ubeatty@gmail.com'

In [63]: FAKER.seed(get_random())

In [64]: FAKER.email()
Out[64]: u'klocko.martha@gmail.com'

In [65]: FAKER.email()
Out[65]: u'lebsack.zela@homenick.info'

In [66]: FAKER.email()
Out[66]: u'lance90@bauch.com'

播种是可选的。但是当我制作一个新对象时,我总是会发现它发出了相同的电子邮件:

In [2]: u = User()

In [3]: u
Out[3]: <User: Ut fugiat quasi aperiam provident error iure. Enim dolor totam quia sint. Porro laudantium aut non ducimus veritatis.>

In [5]: u.email
Out[5]: 'Alfie_Lemke@example.com'

In [6]: u = User()

IntegrityError: duplicate key value violates unique constraint "users_user_email_key"
DETAIL:  Key (email)=(Alfie_Lemke@example.com) already exists.

模型看起来像:

../users.py:

import factory, time
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker

FAKER = Faker(locale='en_US')

class User(DjangoModelFactory):
    class Meta:
        model   = 'users.User'

    first_name              = FAKER.first_name()
    last_name               = FAKER.last_name()
    email                   = FAKER.email()

现在我有:

import factory, random, time
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker


FAKER = Faker(locale='en_US')

def get_random():
    return int((random.SystemRandom(random.seed()).random())*100000000)

class User(DjangoModelFactory):
    class Meta:
        model   = 'users.User'

    FAKER.seed(get_random())

    first_name              = FAKER.first_name()
    last_name               = FAKER.last_name()
    email                   = FAKER.email()

这没有任何区别。如何在 shell 中随机化一些东西,而不是在创建对象时随机化,即使提供了种子?谢谢

4

1 回答 1

6

查看您的工厂,您将属性设置为对 faker 的调用,而不是将它们设置为lazy_attributes。在您的工厂中(我强烈建议将其命名为 UserFactory 或类似名称以防止与您的 users.User 模型混淆),声明您的属性,如下所示:

import factory
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker

FAKER = Faker(locale='en_US')

class User(DjangoModelFactory):
    class Meta:
        model   = 'users.User'

first_name              = lazy_attribute(lambda x: FAKER.first_name())
last_name               = lazy_attribute(lambda x: FAKER.last_name())
email                   = lazy_attribute(lambda x: FAKER.email())

此更改将导致您的工厂在每次执行时调用您的 Faker,而不仅仅是在工厂初始化时。如果您尝试生成要查看特定值的测试数据,您可以使用seed()初始化 Faker 的方法来确保您的数据每次都以相同的方式开始(例如生成 3 个人总是会给出“John Smith ”,然后是“Jane Doe”,然后是“Joe Blow”),以防您专门测试数据中的这些名称。

最后,您提供的 faker 链接看起来像是作者的博客,但您可以在readthedocs上找到该存储库的综合文档。

于 2015-10-21T16:08:23.030 回答