Как набрать подсказку о заводском приспособлении для модели pydantic для тестовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как набрать подсказку о заводском приспособлении для модели pydantic для тестов

Сообщение Anonymous »

Предположим, у меня есть пидантическая модель, такая как этот виджет:

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

models.py

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

from pydantic import BaseModel

class Widget(BaseModel):
name: str
value: float
При написании тестов (с использованием pytest), использующих этот виджет, мне часто хочется иметь возможность создавать виджеты «на лету» с некоторыми значениями по умолчанию для его поля (которые я не хочу устанавливать как значения по умолчанию в целом, то есть в модели, поскольку они предназначены только как значения по умолчанию для тестов), и, возможно, некоторым полям присваиваются определенные значения.
Для этого в моем файле conftest.py сейчас есть такая неуклюжая конструкция:

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

conftest.py

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

from typing import NotRequired, Protocol, TypedDict, Unpack

import pytest

from models import Widget

class WidgetFactoryKwargs(TypedDict):
name: NotRequired[str]
value: NotRequired[float]

class WidgetFactory(Protocol):
def __call__(self, **kwargs: Unpack[WidgetFactoryKwargs]) -> Widget: ...

@pytest.fixture
def widget_factory() -> WidgetFactory:
def _widget_factory(**kwargs: Unpack[WidgetFactoryKwargs]) -> Widget:
defaults = WidgetFactoryKwargs(name="foo", value=42)
kwargs = defaults | kwargs
return Widget(**kwargs)

return _widget_factory
Это дает средству проверки типов возможность проверить, правильно ли я использую фабрику в своих тестах, и дает моей IDE возможности автодополнения:

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

test_widgets.py

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

from typing import assert_type

from conftest import WidgetFactory

def test_widget_creation(widget_factory: WidgetFactory) -> None:
widget = widget_factory()
assert_type(widget, Widget)        # during type checking
assert isinstance(widget, Widget)  # during run time
assert widget.name == "foo"
assert widget.value == 42

widget = widget_factory(name="foobar")
assert widget.name == "foobar"
assert widget.value == 42

widget = widget_factory(value=1337)
assert widget.name == "foo"
assert widget.value == 1337

widget = widget_factory(name="foobar", value=1337)
assert widget.name == "foobar"
assert widget.value == 1337

widget = widget_factory(mode="maintenance")  # type checker error
(реальные тесты, конечно, более сложны и используют виджет другим способом)
Вопрос:< /p>
Есть ли лучший способ обеспечить безопасность такого типа? В идеале я мог бы создать WidgetFactoryKwargs TypedDict «динамически» на основе модели Pydantic. Это, по крайней мере, позволит избавиться от TypedDict (и связанных с этим затрат на поддержание его в соответствии с любыми изменениями в полях модели Pydantic). Но динамическое построение TypedDict явно не поддерживается для статической проверки типов.
Модель Widget, хотя технически динамическая, можно считать статической (нет странное исправление моих моделей после их определения).

Подробнее здесь: https://stackoverflow.com/questions/792 ... -for-tests
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как набрать подсказку для функции с псевдонимом
    Гость » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Гость
  • Как правильно набрать подсказку этому декоратору?
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Как правильно набрать подсказку этому декоратору?
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как набрать подсказку np.nan?
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как набрать подсказку о функции с аргументами по умолчанию?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

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