Testowanie modeli¶
Testowanie modeli polega przede wszystkim na sprawdzeniu czy możemy pracować na utworzonym modelu. Dlatego sprawdzamy możliwość przeprowadzenia podstawowych operacji CRUD na modelu.
Podstawy¶
Jeśli posiadamy model który nie zawiera dużej ilości pól z relacjami, możemy do jego przetestowania wykorzystać factory-boy wraz z metodą clean_fields().
...
def test_create_new_openerrors(self):
open_errors = open_errors_factory.build()
open_errors.clean_fields(exclude=['user']) # EXCLUDE: FK, O2O, M2M Fields
assert open_errors
Wywołując metodę clean_fields sprawdzimy czy pola modelu zawierają wszystkie zdefiniowane i wymagane parametry (na. max_length dla CharField). Sprawdzimy również wszystkie walidatory, które zostały dodane do poszczególnych pól.
Można sprawdzić zapisując obiekt do bazy danych:
@pytest.mark.django_db
def test_create_new_openerrors(self, open_errors_factory):
# Create the venue
openerror = open_errors_factory()
# Check all field and validators
openerror.clean_fields()
# Check we can find it
openerrors = OpenError.objects.all()
assert len(openerrors) == 1
first_openerrors = openerrors[0]
assert first_openerrors == openerror
Testujemy również wszystkie utworzone metody.
@pytest.mark.django_db
class TestOpenErrorsModel:
...
def test_check_attribute_in_openerrors(self, open_errors_factory):
# Check attributes
venue = open_errors_factory(name='Wembley Arena')
assert only_venue.name == 'Wembley Arena'
def test_check_str_representation_of_openerrors(self, open_errors_factory):
# Check string representation
venue = open_errors_factory(name='Wembley Arena')
assert only_venue.__str__() == 'Wembley Arena' # or str(only_venue)
Jeżeli wykorzystujemy nadpisane metody np. save() varto również przetestować je oddzielnie.
class Survey(models.Model):
title = models.CharField(max_length=60)
opens = models.DateField()
closes = models.DateField()
def save(self, **kwargs):
if not self.pk and not self.closes:
self.closes = self.opens + datetime.timedelta(7)
super(Survey, self).save(**kwargs)
@pytest.mark.django_db
class SurveySaveTest:
t = "New Year"
sd = datetime.date(2018, 1, 1)
def test_closes_autoset(self, survey_factory):
s = survey_factory(title=self.t, opens=self.sd)
assert s.closes == datetime.date(2018, 1, 4))
def test_closes_honored(self, survey_factory):
s = survey_factory(title=self.t, opens=self.sd, closes=self.sd)
assert s.closes == self.sd
def test_closes_reset(self, survey_factory):
s = survey_factory(title=self.t, opens=self.sd)
s.closes = None
with pytest.raises(IntegrityError):
s.save()
def test_title_only(self):
with pytest.raises(IntegrityError):
Survey.objects.create(title=self.t)