如何与pydantic模型模式进行精确的一对一匹配验证?



如何准确匹配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'的字符串值,或Extraenum的值(默认为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"