使用FastAPI TestClient时如何校验JSON响应的类型与键存在性
校验键存在的实现方法
首先注意:FastAPI TestClient的响应对象中,json是调用方法而非属性,需要加括号response.json()才能拿到返回的字典数据。
1. 仅校验指定键存在
直接判断目标键是否在返回的字典中即可:
resp_data = response.json() # 校验单个键 assert "userID" in resp_data
如果需要校验多个键同时存在:
resp_data = response.json() expected_keys = {"userID", "userName", "avatar"} assert expected_keys.issubset(resp_data.keys()), "返回结果缺少必要字段"
2. 同时校验键存在+值类型
在确认键存在的基础上用isinstance判断类型即可:
resp_data = response.json() assert "userID" in resp_data assert isinstance(resp_data["userID"], int)
3. 声明式schema校验(接近你期望的写法)
可以自行封装一个通用校验函数,实现你示例中{'userID': int}的写法效果:
def validate_resp_schema(resp_data: dict, schema: dict): for key, expect_type in schema.items(): assert key in resp_data, f"缺失预期字段:{key}" assert isinstance(resp_data[key], expect_type), f"字段{key}类型错误,期望{expect_type},实际为{type(resp_data[key])}" # 调用示例 resp_data = response.json() validate_resp_schema(resp_data, {"userID": int})
可选:复杂场景用Pydantic校验
如果需要校验嵌套结构、可选字段、值范围等更复杂的规则,直接用Pydantic定义期望模型即可,也可以直接复用FastAPI接口本身的返回模型,不用重复开发:
from pydantic import BaseModel # 定义期望的返回结构 class UserResponse(BaseModel): userID: int userName: str resp_data = response.json() # 不抛出ValidationError就代表校验通过 UserResponse(**resp_data)
内容的提问来源于stack exchange,提问作者michael holstein
相关产品推荐
相关产品推荐

