2015-07-28 1 views
1

У меня есть несколько моделей для UnitTest с помощью обманщика (http://www.joke2k.net/faker/), и это случайное в оболочке:обманщик (питон) рандомизирует в оболочке, но не в DjangoModelFactory объекта

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'[email protected]' 

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

In [62]: FAKER.email() 
Out[62]: u'[email protected]' 

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

In [64]: FAKER.email() 
Out[64]: u'[email protected]' 

In [65]: FAKER.email() 
Out[65]: u'[email protected]' 

In [66]: FAKER.email() 
Out[66]: u'[email protected]' 

Посев является необязательным. Но когда я делаю новый объект, я всегда получаю, что он сделал то же самое по электронной почте:

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]: '[email protected]' 

In [6]: u = User() 

IntegrityError: duplicate key value violates unique constraint "users_user_email_key" 
DETAIL: Key (email)=([email protected]) 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() 

который не имеет значения. Как может что-то рандомизироваться в оболочке, но не на создание объекта, даже если кормить семя? Спасибо

ответ

1

Глядя на свою фабрику, вы устанавливаете свои атрибуты для вызова фейкера, вы не устанавливаете их как 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 при каждом выполнении, а не только при инициализации фабрики. Если вы пытаетесь генерировать тестовые данные, которые хотите просмотреть для определенных значений, вы можете использовать метод вашего инициализированного Faker, чтобы убедиться, что ваши данные запускаются одинаково каждый раз (например, генерация 3 человек всегда будет давать «Джон» Smith », затем« Jane Doe », затем« Joe Blow »), если вы специально тестируете эти имена в своих данных.

Наконец, ссылка на фейкер, которую вы предоставили, выглядит так, как будто она попадает в блог автора, но вы можете найти исчерпывающую документацию для этого репозитория на .

Смежные вопросы