FastAPI文件上传接口pytest测试未触发预期HTTPException问题排查
测试中的错误及修复方案
你的测试存在两个核心问题:
1. 错误使用pytest.raises捕获异常
FastAPI的TestClient发送请求时,后端抛出的HTTPException会被框架自动转换为HTTP响应对象返回,而非直接在客户端代码中抛出异常。因此用pytest.raises(HTTPException)无法捕获到预期异常,这是测试失败的主要原因。
2. 文件参数名不匹配
接口定义中接收文件的参数名为upload_file,但测试代码里用'file'作为files字典的键。FastAPI会根据参数名匹配上传文件,这会导致后端无法正确接收文件,触发非预期的422错误,而非你要验证的格式检查逻辑。
修复后的测试代码
import pytest from fastapi.testclient import TestClient from io import BytesIO def test_upload_file(client: TestClient): # 用BytesIO创建临时测试内容,避免依赖本地真实文件 test_content = b"dummy file content" # 参数名与接口定义的upload_file保持一致 files = {'upload_file': ('test_file.docx', BytesIO(test_content))} # 发送请求并获取响应对象 response = client.post('/api/v1/upload-file/', files=files) # 验证响应状态码和错误详情 assert response.status_code == 422 assert response.json()['detail'] == 'Only .txt file allowed'
额外优化建议
- 测试S3上传逻辑时,建议用mock替代真实的S3客户端,避免测试依赖外部云服务,提升测试稳定性和速度。
内容的提问来源于stack exchange,提问作者some_programmer
相关产品推荐
相关产品推荐

