FastAPI单元测试返回422状态码,寻求排查解决建议
解决FastAPI测试返回422状态码的问题
核心原因
422状态码表示请求格式正确但数据语义验证失败,你的问题出在日期格式不匹配:
EventCreate类中date字段定义为datetime类型,FastAPI默认只识别ISO 8601格式的日期字符串(如2023-06-15或2023-06-15T00:00:00)。- 你测试代码里用
my_date.strftime('%m-%d-%Y')生成了06-15-2023这种格式,FastAPI无法自动将其解析为datetime对象,导致验证失败。
解决方法
方法1:修改测试代码的日期格式
直接生成FastAPI能识别的ISO格式日期字符串,修改测试代码如下:
def test_create_event(self): my_date = datetime.date(2023, 6, 15) data = { 'title': 'Winter Cooking', 'host': 'Steven', 'ingredients': ['Apples','Pumpkin','Pecans','Oats'], 'date': my_date.isoformat(), # 生成ISO格式:2023-06-15 'participants': ['Steven','Kyle'], 'submitter_id': 1 } response = requests.post(self.url + '/events/', json=data) print("response=" + str(response.status_code)) self.assertEqual(response.status_code, 201)
也可以直接写字符串'2023-06-15'或者带时间的'2023-06-15T12:00:00',都能被正确解析。
方法2:自定义日期格式解析(如果需要支持MM-DD-YYYY)
如果你的业务场景必须接受MM-DD-YYYY格式的日期,可以给EventCreate的date字段添加自定义验证器,用Pydantic的@field_validator来处理:
from pydantic import BaseModel, field_validator from datetime import datetime from typing import List class EventCreate(BaseModel): title: str host: str ingredients: List[str] = [] date: datetime participants: List[str] = [] submitter_id: int @field_validator('date', mode='before') def parse_date(cls, value): if isinstance(value, str): # 尝试解析MM-DD-YYYY格式 try: return datetime.strptime(value, '%m-%d-%Y') except ValueError: # 如果解析失败,保留原格式让默认验证器处理(比如ISO格式) pass return value
这样修改后,你的测试代码里的'%m-%d-%Y'格式日期就能被正确解析,同时也兼容默认的ISO格式。
额外检查点
确认你的测试代码中:
- 没有再传入
id字段(因为EventCreate不需要,id是后端通过counter生成的) - 已包含
submitter_id字段(你已经加上了,这部分没问题)
内容的提问来源于stack exchange,提问作者Steve Malek
相关产品推荐
相关产品推荐

