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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:31:14