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
相关产品推荐
相关产品推荐

