You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI Pytest测试:Client返回422状态码问题排查

问题分析与解决

核心问题:请求参数传递方式错误

你收到422状态码(Unprocessable Entity)的根本原因是测试中错误地用URL查询参数传递请求体数据,而FastAPI的CreateService参数是作为请求体接收的。

在main.py的post_service函数中,service: CreateService是请求体参数(FastAPI默认将Pydantic模型参数视为请求体),但你的测试代码用params={"service": service.dict()}把数据放到了URL查询参数里,服务器无法将这种格式的参数解析为CreateService模型,因此返回422错误。

修复测试代码

将测试中的params替换为json参数,正确传递JSON请求体:

def test_create_service(client, db: Session = Depends(get_db)):
    key = Key(service_key='testkey1', service_value='testvalue1')
    service = CreateService(
        name="testname1",
        version="testversion1",
        is_used=True,
        keys=[key, ]
    )
    # 使用json参数传递请求体,而非params
    response = client.post("/create_service", json=service.dict())
    # 注意:路由定义的状态码是201,断言需匹配该值
    assert response.status_code == status.HTTP_201_CREATED

另外需要修正断言的状态码:你的路由@app.post指定了status_code=status.HTTP_201_CREATED,所以测试断言应匹配201而非原来的200。

额外潜在问题提示

main.py中sub_dicts变量存在未定义风险:仅当service_dict包含list类型的key时才会被赋值,若没有符合条件的key,后续if not sub_dicts:会触发NameError。建议提前初始化变量:

sub_dicts = []
for key in list(service_dict):
    if isinstance(service_dict[key], list):
        sub_dicts = service_dict[key]

内容的提问来源于stack exchange,提问作者Konstantinos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:45:31