Ich versuche, ein oder mehrere Felder eines pydantischen Modells (v2+) in einem Unit -Test zu patchen. < /p>
Warum?
Ich möchte ein Feld mit einem Enum -Feld verspotten, mit einer einfacheren/kleineren Aufzählung, um das Testenbehandlungsrauschen zu verringern. Zum Beispiel, wenn ich; < /p>
habe
Code: Select all
from pydantic import BaseModel
class Foo(BaseModel):
field: FooEnum
Code: Select all
from enum import Enum
class FooEnum(Enum):
"""Some enum with lot's of fields"""
Versuchte Lösungen < /h1>
Der folgende Ansatz "funktioniert", aber dies war das Ergebnis des Hackens im pydantischen Quellcode, um zu sehen, wie ich Felder patchen konnte . < /p>
Code: Select all
from contextlib import contextmanager
from unittest import mock
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from pydantic import BaseModel
from pydantic.fields import FieldInfo
@contextmanager
def patch_pydantic_model_field(
target: type[BaseModel], field_overrides: dict[str, FieldInfo]
) -> Generator[type[BaseModel], None, None]:
model_fields = target.model_fields
with mock.patch.object(
target=target, attribute="model_fields", new_callable=mock.PropertyMock
) as mock_fields:
# ? Override the model with new mocked fields.
mock_fields.return_value = model_fields | field_overrides
target.model_rebuild(force=True)
yield target
target.model_rebuild(force=True)
< /code>
Verwendung < /h3>
@pytest.mark.parametrize(
"field_overrides",
[{"field": FieldInfo(annotation=MockFooEnum, required=True)}],
)
def test_foo(field_overrides):
with patch_pydantic_model_field(Foo, field_overrides):
assert