Вы можете добавить метод "сейчас" в ваш сериализатор и смоделировать эту функцию в ваших тестах.По сути, это создает прокси для метода datetime на вашем сериализаторе ради тестов.
serializers.py
class MySerializer(serializers.ModelSerializer):
def now(self):
return datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
def validate_start(self, value):
if value < self.now():
raise ValidationError({'start': 'Start cannot be in the past'})
return value
tests.py
def test_should_not_allow_setting_start_datetime_in_the_past(self):
serializer = MySerializer(
data={
'start': datetime.datetime(2000, 1, 1, tzinfo=datetime.timezone.utc),
}
)
with self.assertRaisesMessage(
ValidationError, 'Start cannot be in the past'
), mock.patch(
"app.serializers.MySerializer.now"
) as now:
now.return_value = datetime.datetime(2001, 1, 1, tzinfo=datetime.timezone.utc)
serializer.is_valid(raise_exception=True)