FastAPI Mock失效排查:patch未生效导致返回原始值
问题原因及解决方案
核心问题
你的Mock未生效,是因为Python导入机制导致的引用不匹配:
- 在
app.py中,你通过from app_dep import resp将resp函数的引用导入到了app模块的命名空间中 create函数调用的是这个本地引用,而非直接从app_dep模块调用- 你patch的是
app_dep.resp,但app模块里的resp依然指向原函数,所以Mock不会生效
另外你代码里还有一个小错误:return_value={'name', 'mocked'}是集合类型,而你预期的是字典,要改成{'name': 'mocked'}。
解决方法
方法一:修改Mock的目标路径
直接patch app模块中的resp引用:
def test_create_item(mocker): mocker.patch( 'app.resp', # 目标改为app模块内的resp return_value={'name': 'mocked'} # 修正为字典格式 ) r = client.post("/ehsan") print(r.json())
方法二:修改函数调用方式
通过模块引用调用resp,确保patch的目标和实际调用的是同一个对象:
修改app.py的导入和调用逻辑:
# 替换原导入语句 import app_dep # 修改create函数 @app.post("/ehsan", status_code=status.HTTP_201_CREATED) async def create(): return app_dep.resp() # 通过模块调用resp
此时原Mock代码(patch app_dep.resp)即可正常生效。
内容的提问来源于stack exchange,提问作者ehsan shirzadi
相关产品推荐
相关产品推荐

