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

pytest无法识别Mock的嵌套函数,调用真实函数致测试失败求助

问题分析与解决方法

核心问题是mock的路径不正确,Python的unittest.mock是基于代码实际引用的对象路径来替换的,而非原函数的定义路径。

原因说明

如果你的scheduler_api.py中是通过from drpCtReactor.utils.reactor_client import get_client这种方式导入get_client的,那么在scheduler_api模块的命名空间里,get_client是一个本地引用。此时你mock原模块drpCtReactor.utils.reactor_client.get_client不会生效,因为被测试的create函数调用的是scheduler_api模块内的本地引用,而非原模块的函数。

修正后的测试代码

将patch的目标路径改为被测试模块中get_client的实际引用路径,比如如果create函数在scheduler_api.py中,就patchscheduler_api.get_client:

def test_create():
    scheduler_to_create = Scheduler(title = "test_scheduler", description="test scheduler")
    stub_scheduler_created = Scheduler(uuid="1", title="test_scheduler", description="test scheduler")

    # 重点:替换为被测试模块中get_client的引用路径
    with patch("scheduler_api.get_client") as mock_client:
        mock_client.return_value.create_scheduler.return_value = stub_scheduler_created
        result = create(scheduler_to_create)
        # 建议添加断言验证结果符合预期
        assert result == stub_scheduler_created

额外验证方式

如果不确定正确的mock路径,可以在scheduler_api.py的create函数中临时添加一行打印:

print(get_client.__module__)

运行测试后,打印出的模块路径就是你需要patch的目标前缀。

内容的提问来源于stack exchange,提问作者Abdul Salam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:27:18