Допустим, у меня есть простая модель Django:
class Transaction(models.Model):
description = models.CharField('description', max_length=150,
validators=[MinLengthValidator(2, 'Description\'s min length is 2'), ])
amount = models.DecimalField('amount', max_digits=10, decimal_places=2,
validators=[MinValueValidator(1, 'Min value is 1'), ])
user = models.ForeignKey(User)
# to trigger model fields' validation
def clean(self, *args, **kwargs):
super(Transaction, self).clean(*args, **kwargs)
def save(self, *args, **kwargs):
self.full_clean()
super(Transaction, self).save(*args, **kwargs)
И я хотел бы провести модульный тест, который точно проверяет, повышается ли ValidationError
полем description , а не полем amount (или любым другим).
Итак, у меня есть этот тест, который примитивно проверяет, присутствует ли поле description в e.exception
:
def test_model_requires_description_min_2_characters(self):
with self.assertRaises(ValidationError) as e:
Transaction.objects.create(description='a', amount="50", user=self.user1)
err_dict = eval(str(e.exception))
self.assertIn('description', err_dict.keys())
Но мне не очень нравится использовать eval()
, и я считаю, что есть более элегантный способ указать источник ValidationError
. Как я могу это сделать?
РЕДАКТИРОВАТЬ: мой класс модели также включает переопределенные методы clean()
и save()
, поэтому валидаторы работают нормально.