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
相关产品推荐
相关产品推荐

