pytest未成功patch函数:FastAPI中mock第三方API调用失败
问题原因及解决方案
你的mock没生效是因为Python的mock机制基于模块引用关系,你patch的是原函数所在的模块,但实际路由里调用的是导入到当前模块后的函数引用。
举个实际场景:假设你的路由代码在app/api/chargers.py里,是这么导入get_state的:
from app.services.homeassistant import get_state @router.get("/chargers/{charger_id}") def fetch_charger(charger_id: int): # 这里调用的是当前模块(app.api.chargers)内的get_state本地引用 state = get_state(charger.entity_id) ...
这种情况下,你patchapp.services.homeassistant.get_state只会修改原模块里的函数,但路由模块在导入时已经拿到了原函数的引用,不会随原模块函数的变化而更新,所以测试时还是会调用真实的第三方API。
解决步骤
- 定位实际调用get_state的路由模块(比如上面例子中的
app.api.chargers) - 修改测试中的patch路径,指向该模块内的get_state引用:
def test_fetch_charger(mocker, client, charger): mock_response = "0.0" # 替换为调用get_state的模块路径 mocker.patch('app.api.chargers.get_state').return_value = mock_response response = client.get(f"/chargers/{charger.id}") assert response.status_code == 200 # 可以追加断言验证mock是否生效 assert response.json()["state"] == mock_response
如果你的路由代码是通过import app.services.homeassistant as ha然后调用ha.get_state(),那你原来的patch路径是有效的,但这种场景较少,绝大多数情况都是直接导入函数,所以重点检查导入方式和patch路径是否匹配。
内容的提问来源于stack exchange,提问作者Kåre Rasmussen
相关产品推荐
相关产品推荐

