requests.post触发421状态码失败,HTTPretty测试未通过
问题分析与解决
你的问题出在HTTPretty对421状态码的默认处理逻辑上。421(Misdirected Request)属于HTTP/2引入的特殊状态码,HTTPretty在默认配置下模拟这个状态码时,可能没有正确构建完整的HTTP响应(比如缺少必要的响应头),导致requests库认为连接被异常中断,直接抛出ConnectionError,根本没机会走到状态码判断的逻辑。
修复方案
方案1:添加完整的响应头
在httpretty.register_uri中显式指定headers参数,确保响应包含必要的HTTP头,让requests能正确解析响应:
@httpretty.activate def test_http_status_code_421(): httpretty.register_uri( method=httpretty.POST, uri="http://whatever.com", body="{}", status=421, headers={"Content-Type": "application/json"} # 关键:补充响应头 ) with pytest.raises(MisRedirectedRequest): call_service({"123", "543"})
方案2:升级HTTPretty版本
部分旧版本的HTTPretty对HTTP/2新增的状态码支持不完善,升级到最新版本可能直接解决问题:
pip install --upgrade httpretty
方案3:手动构建响应(备选)
如果上述方案无效,可以尝试用httpretty.Response手动构建完整响应:
@httpretty.activate def test_http_status_code_421(): def custom_response(request, uri, headers): return httpretty.Response( body="{}", status=421, headers={"Content-Type": "application/json"} ) httpretty.register_uri( method=httpretty.POST, uri="http://whatever.com", body=custom_response ) with pytest.raises(MisRedirectedRequest): call_service({"123", "543"})
验证逻辑
添加响应头后,requests能正确接收并解析421状态码,进而执行你的异常抛出逻辑,测试就能正常通过了。其他状态码(如420、500)因为是HTTP/1.1标准定义的,HTTPretty默认处理逻辑没问题,所以测试正常。
内容的提问来源于stack exchange,提问作者Luís Soares
相关产品推荐
相关产品推荐

