Django не выбрасывает ошибку ValidationError при отсутствии обязательных полей
В настоящее время я тестирую свою модель django с помощью pytest (и pytest-django), но я не могу написать неудачный тест, в котором отсутствует обязательное поле.
Моя Person
-модель требует только name
и company
. Остальные поля являются обнуляемыми и поэтому необязательными.
models.py
:
from django.db import models
# Create your models here.
class Person(models.Model):
name = models.CharField(max_length=64)
company = models.CharField(max_length=128)
position = models.CharField(max_length=64, null=True, blank=True)
date_of_birth = models.DateField(null=True, blank=True)
def __str__(self):
return (f"{self.name}"
+ (f", {self.position}" if self.position is not None else "")
+ f"({self.company})"
+ (f" born {self.date_of_birth}" if self.date_of_birth is not None else "")
)
test.py
from .models import Person
import pytest
from django.core.exceptions import ValidationError
pytestmark = pytest.mark.django_db
# Create your tests here.
def test_minimal_person():
"""Test if a minimal person can be created"""
valid_person = Person(name="Max Mustermann", company="ACME")
valid_person.save()
assert len(Person.objects.get_queryset()) == 1
def test_insufficient_params():
with pytest.raises(ValidationError):
invalid_person = Person()
invalid_person.save()
def test_missing_company():
with pytest.raises(ValidationError):
invalid_person = Person(name="Max")
invalid_person.save()
def test_missing_name():
with pytest.raises(ValidationError):
invalid_person = Person(company="ACME")
invalid_person.save()
def test_invalid_date_format():
"""Test if an invalid date format throws a ValidationError"""
with pytest.raises(ValidationError):
invalid_person = Person(name="Max", company="ACME", date_of_birth="not-a-date")
invalid_person.save()
Тесты test_invalid_date_format
и test_minimal_person
успешны, но другие не выбрасывают (ожидаемую) ошибку.
Что я здесь упускаю?
Метод save()
не делает никакой проверки для ваших полей, потому что они могут попасть в базу данных, когда пусты. См. Что происходит при сохранении? Причина, по которой недопустимая дата выбрасывает ошибку ValidationError
, заключается в том, что это не дата. Однако пустая строка все равно является строкой и может быть сохранена в базе данных как таковая. Для принудительной валидации вызовите метод full_clean()
объекта модели.