如何Mock同一文件中未被测试方法导入的函数?
解决Python Mock中无法patch本地函数的问题
你遇到的问题其实是mock.patch的目标路径没写对——它不像mock系统库(比如math.ceil)那样直接写函数名就行,针对本地函数,必须指定被调用代码所在模块中的函数引用路径。
问题原因
你的method_2是在当前模块里调用method_1的,所以当你用patch('method_1')时,mock找不到这个目标——它需要明确知道要替换哪个模块里的method_1引用,而不是只写函数名。
修复方法
把test_2里的patch目标改成当前模块的method_1就行,直接用__main__.method_1(如果是直接运行这个脚本的话),或者用你的脚本文件名(比如如果脚本叫unittest.py,也可以写unittest.method_1)。修改后的test_2代码如下:
def test_2(): m = Mock(return_value=20) # 指定当前模块的method_1引用 with patch('__main__.method_1', m) as p: a = method_2() assert(a == 21)
补充原理
mock.patch的核心逻辑是替换被调用处的引用:
- 对于
math.ceil,你在method_1里导入的是系统库的ceil,所以直接patchmath.ceil就能替换掉这个引用; - 对于
method_1,method_2调用的是当前模块里的method_1引用,所以必须patch当前模块中的这个引用,而不是只写函数名。
这样修改后,你的test_2就能正常通过了。
内容的提问来源于stack exchange,提问作者rohithpr
相关产品推荐
相关产品推荐

