Python单元测试:含if-return的方法如何校验后续方法调用
报错原因
你遇到的断言错误来自两个核心问题:
- 被
mock.patch替换的do_something默认是MagicMock对象,调用后不会执行原方法逻辑,而是返回一个新的MagicMock实例,你代码里写的assert out_value is True本身不符合业务逻辑:传入参数2时if条件不成立,原逻辑下do_something返回False,out_value本来就不是True。 - 你没有给mock对象指定返回值,导致out_value是MagicMock实例,和True做
is判断自然会失败。
正确实现方式
根据你的测试目标(验证if判定为False时do_something被调用),可以选以下任意一种写法:
方案1:手动指定mock返回值,同时验证返回值和调用行为
给mock的do_something设置和原方法一致的返回值,既校验调用次数,也校验返回逻辑:
import pytest from unittest import mock import costa_test.genericfunctions.simplefunctions as sf @mock.patch("costa_test.genericfunctions.simplefunctions.Class.do_something") def test_compare_vals(mock_do_something): # 配置mock返回值和原方法保持一致 mock_do_something.return_value = False compare_obj = sf.Class() out_value = compare_obj.compare_vals(2) assert out_value is False # 直接用封装好的断言方法验证调用次数 mock_do_something.assert_called_once()
方案2:用wraps参数包装原方法,自动保留原逻辑
如果不想手动维护mock的返回值,希望mock只记录调用行为、不改变原方法的执行逻辑,可以加wraps参数指向原方法:
import pytest from unittest import mock import costa_test.genericfunctions.simplefunctions as sf @mock.patch( "costa_test.genericfunctions.simplefunctions.Class.do_something", wraps=sf.Class.do_something ) def test_compare_vals(mock_do_something): compare_obj = sf.Class() out_value = compare_obj.compare_vals(2) assert out_value is False mock_do_something.assert_called_once()
这种写法的好处是后续如果do_something的返回值逻辑修改,不需要同步改测试里的mock配置。
方案3:仅验证调用行为,不校验返回值
如果你的测试点只关心方法是否被调用,不需要校验返回结果,直接去掉错误的返回值断言即可:
import pytest from unittest import mock import costa_test.genericfunctions.simplefunctions as sf @mock.patch("costa_test.genericfunctions.simplefunctions.Class.do_something") def test_compare_vals(mock_do_something): compare_obj = sf.Class() compare_obj.compare_vals(2) mock_do_something.assert_called_once()
内容的提问来源于stack exchange,提问作者laurentius
相关产品推荐
相关产品推荐

