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'}