You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

解决步骤

  1. 定位实际调用get_state的路由模块(比如上面例子中的app.api.chargers)
  2. 修改测试中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:05:16