如何正确设置mock.patch mock对象方法返回值以通过单元测试
错误原因
报错根因是对类装饰器@mock.patch的mock对象结构理解偏差:
- 用
@mock.patch("bla.Tool")注入的参数mtool是被模拟的Tool类本身 - 业务代码中
toolio = Tool()实例化得到的对象,实际是mtool.return_value对应的MagicMock实例,而非mtool本身 - 原代码直接给
mtool.act设置返回值,根本没有作用到实际被调用的实例方法上,导致toolio.act()返回默认的MagicMock对象,拿这个对象和整数2做<=比较时就会抛出类型不支持的错误。 - 额外还有个API误用:unittest.mock的调用断言方法是
assert_called(),不存在assert_was_called()这个方法。
修正方案
只需要把方法返回值配置、调用断言都绑定到mock类的实例(也就是mtool.return_value)上,同时修正断言方法名即可,完整测试代码如下:
from unittest import mock import bla @mock.patch("bla.Tool") def test_exercise_tool(mtool): # 拿到Tool()实例化生成的mock实例 mock_instance = mtool.return_value # 给实例的act方法配置固定返回值3 mock_instance.act.return_value = 3 # 验证act返回3时,exercise_tool的返回结果为False assert not bla.exercise_tool() # 断言实例的m1方法确实被调用过 mock_instance.m1.assert_called()
执行逻辑说明
修正后测试运行流程完全符合预期:
- 业务代码调用
Tool()时,直接返回我们提前配置好的mock实例 - 循环中执行的
toolio.m1(i)调用会被mock实例自动记录调用轨迹 toolio.act()会返回预设的3,3 <= 2计算结果为False,断言通过- 最后校验m1方法的调用记录,断言正常通过
内容的提问来源于stack exchange,提问作者Mike C
相关产品推荐
相关产品推荐

