Pydantische V2 Patching -ModellfelderPython

Python-Programme
Anonymous
 Pydantische V2 Patching -Modellfelder

Post by Anonymous »

Problem < /h1>
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
Wob

Code: Select all

from enum import Enum

class FooEnum(Enum):
"""Some enum with lot's of fields"""
Wenn ich das Verhalten explizit validieren möchte, wenn eine ungültige Aufzählung an foo übergeben wird, kann die Fehlermeldung ein Ärgernis sein, mit dem man sich befassen kann. Daher wollte ich Foo.field mit einem kleineren Mockfooenum verspotten, um die Lesbarkeit des Tests zu verbessern und diesen Unit -Test zu aktualisieren, wenn ein neues Feld zu fooenum . < /p>
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 
Dieser Ansatz scheint ein bisschen wie ein Bodge zu sein und war neugierig, ob es einen schöneren Weg gibt, um das oben genannte zu erreichen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post