如何准确匹配Pydantic模式?
建议的方法是尝试将字典转换为Pydantic模型,但这不是一对一匹配。
我正在使用类似的API响应模式验证使用pytest。
class Model_actual(BaseModel):
val1 : str
dict_to_be_validated = {'val1':'Hello', 'val2':'World'}
assert Model_actual(**dict_to_be_validated) is not None
我正在寻找这个断言失败而不是通过,因为这不是一对一的匹配。
默认情况下,pydanticBaseModel
的忽略额外字段(本例中为val2
)。
可以通过设置BaseModel
的model Configextra
选项,告诉模型禁止额外字段,并引发一个ValidationError
。
class Model_actual(BaseModel):
val1: str
class Config:
extra = "forbid"
extra
是否在模型初始化期间忽略、允许或禁止额外属性。接受
'ignore'
、'allow'
、'forbid'
的字符串值,或Extra
enum的值(默认为Extra.ignore
)。如果包含额外的属性,'forbid'
将导致验证失败,'ignore'
将静默地忽略任何额外的属性,'allow'
将将这些属性分配给模型。
In [1]: from pydantic import BaseModel
...:
...: class Model_actual(BaseModel):
...: val1: str
...:
...: class Config:
...: extra = "forbid"
...:
In [2]: dict_to_be_validated = {"val1": "Hello", "val2": "World"}
In [3]: Model_actual(**dict_to_be_validated)
---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
Input In [3], in <cell line: 1>()
----> 1 Model_actual(**dict_to_be_validated)
File ~/path/to/venv/lib/python3.9/site-packages/pydantic/main.py:331, in pydantic.main.BaseModel.__init__()
ValidationError: 1 validation error for Model_actual
val2
extra fields not permitted (type=value_error.extra)
要在pytest测试函数中捕获它,您可以让测试断言引发了异常。
def test_model_ok():
dict_to_be_validated = {"val1": "Hello"}
obj = Model_actual(**dict_to_be_validated)
assert obj.val1 == "Hello"
def test_model_ng():
dict_to_be_validated = {"val1": "Hello", "val2": "World"}
with pytest.raises(ValidationError) as exc:
Model_actual(**dict_to_be_validated)
assert exc.value.errors()[0]["msg"] == "extra fields not permitted"