Ограничения тестирования пикантных моделейPython

Программы на Python
Ответить
Anonymous
 Ограничения тестирования пикантных моделей

Сообщение Anonymous »

Предположим, у меня есть модель

Код: Выделить всё

from pydantic import BaseModel

class Book(BaseModel):
name: str
description: str = Field(min_length=1, max_length=64, pattern="^[a-z]+$")
Я хотел бы написать модульные тесты, гарантирующие правильное определение модели.
Чтобы внести ясность: я доверяю pydantic, чтобы правильно проверить, что такое определены, я не доверяю ни себе, ни моим коллегам, что они всегда правильно определят ограничения модели, которые являются нашими бизнес-требованиями.
Чтобы проверить эти ограничения/требования, я испытываю желание создать экземпляры модель с неверными значениями, затем поймайте ValidationError, затем проверьте содержимое ошибки, чтобы убедиться, что это ожидаемая ошибка.
Что-то вроде:

Код: Выделить всё

def test_book__error_invalid_description():
with pytest.raise(ValidationError) as err:
Book(name="toto", description="123")
assert "pattern_error" in err.value.errors # not working, that's just the idea
Однако я считаю это очень некрасивым и сложным в обслуживании. Кроме того, я считаю, что это в основном тестирование самого pydantic и лишь немного моих требований (здесь даже не все случаи требования к шаблону проверены).
Я бы предпочел проверить наличие сами ограничения, но я не могу найти понятный и лаконичный способ сделать это.
Вот что я пробовал:

Код: Выделить всё

from annotated_types import MinLen, MaxLen

def test_book__validation_constraints():
assert Book.model_fields["name"].is_required()
assert MinLen(1) in Book.model_fields["description"].metadata
assert MaxLen(64) in Book.model_fields["description"].metadata
assert # no idea how to assert pattern
Есть ли лучший способ сделать это?
Считаете ли вы, что проверять такого рода требования излишне?


Подробнее здесь: https://stackoverflow.com/questions/790 ... tic-models
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»