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

pytest中使用mock.patch模拟函数未生效是什么原因?

问题解决

问题原因

Python unittest.mock 的打补丁规则是必须补丁到函数实际被调用的作用域,而非函数的原始定义路径。
你在main.py中使用from src.tools.tool_a import fun的方式导入函数时,fun会被绑定到src.main模块的独立命名空间中,此时main_fun调用的是src.main作用域下的fun引用,你补丁原始定义路径src.tools.tool_a.fun不会修改已经导入到main模块的引用,因此还是会执行原函数抛出异常。

解决方法

有两种可行的修改方案,任选其一即可:

方案1:修改补丁路径(推荐,无需修改业务代码)

将测试代码中的补丁路径改为src.main.fun,即实际调用的fun所在的作用域:

from unittest.mock import patch
from src.main import main_fun

@patch('src.main.fun')
def test_main_fun(mock_fun):
    main_fun()
    # 可选:添加调用验证逻辑
    mock_fun.assert_called_once()

方案2:修改业务代码的导入方式

如果希望补丁原始定义路径生效,可以调整main.py的导入逻辑,改为导入整个模块而非直接导入函数:

# main.py 修改后内容
from src.tools import tool_a

def main_fun():
    tool_a.fun()

此时你原测试代码中的@patch('src.tools.tool_a.fun')写法即可正常生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:33:03