Użycie @niepodam.pl w fabrykach modeli

Jeśli jeszcze w swoich testach nie wykorzystujesz fabryk modeli to gorąco zachęcam do zapoznania się z Factory Boy — to genialne narzędzie zastępujące fixtures w testach.

Tam gdzie musieliśmy tworzyć zestawy danych i zarządzać nimi tak by pasowały do wszystkich przypadków testowych, fabryki modeli pozwalają nam na zawołanie utworzyć struktury danych z użyciem wartości losowych — zamiast generować dane i trzymać je w plikach tworzymy zbiory w miarę potrzeb.

Jednym z takich danych będą adresy email. Tutaj z pomocą przychodzi Faker generujący nam losowe adresy email. Używając providera email możemy podać domenę np. niepodam.pl i dzięki temu korzystać z dobrodziejstw tego serwisu podczas naszych testów — nigdy więcej zakładania testowych skrzynek, zarządzania hasłami ciągłego przelogowywania się by sprawdzić wiadomości podczas testów manualnych.

>>> import faker
>>> fake = faker.Faker()
>>> fake.email(domain='niepodam.pl')
'berrywhitney@niepodam.pl'

Z wykorzystaniem fabryki jest jeszcze wygodniej:

>>> import factory
... import faker
... from django.contrib.auth import get_user_model
... 
... fake = faker.Faker()
... 
... 
... class UserFactory(factory.DjangoModelFactory):
...     first_name = factory.Faker('first_name')
...     last_name = factory.Faker('last_name')
...     email = factory.LazyAttribute(lambda obj: '%s@niepodam.pl' % obj.username)
...     username = factory.Sequence(lambda n: fake.user_name() + str(n))
...     is_staff = False
...     is_active = True
... 
...     class Meta:
...         model = get_user_model()
... 

>>> import pprint
>>> pprint.pprint(UserFactory().__dict__)
{'_state': <django.db.models.base.ModelState object at 0x7f951a3e57b8>,
 'date_joined': datetime.datetime(2019, 10, 29, 8, 54, 17, 387738, tzinfo=<UTC>),
 'email': 'traviscarter8@niepodam.pl',
 'first_name': 'Devin',
 'id': 8,
 'is_active': True,
 'is_staff': False,
 'is_superuser': False,
 'last_login': None,
 'last_name': 'Deleon',
 'password': '',
 'username': 'traviscarter8'}

Leave a Reply

Back to Top