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

Python:Mock对象未被调用导致断言失败问题求助

问题分析与解决

错误原因

你碰到的AssertionError核心问题很明确:

  • 你用Mock替换了client,但不管是测试代码还是原类逻辑里,都只是访问了Mock的result属性,从来没有把这个Mock当作函数/方法调用(也就是没写过client_object.client()这种代码)。
  • assert_called()的作用是验证Mock实例是否被执行过调用操作,你的场景里根本没做这件事,所以断言必然失败。

原代码逻辑核对

看你的FakeClientClass,call_client方法只是直接返回self.client.result——如果这就是你真实的业务逻辑,那你完全不需要用assert_called();如果你的业务逻辑本来应该是调用client对象(比如self.client())再获取结果,那得先修正原类代码:

class FakeClientClass:
    def __init__(self):
        self.client = None

    def call_client(self):
        # 修正为调用client后获取结果(如果这是真实需求)
        return self.client().result

正确测试方案

场景1:验证属性被访问(原逻辑就是读属性)

如果业务逻辑确实只是读取client.result,那应该用PropertyMock来跟踪属性访问,而非用普通Mock的assert_called():

from unittest import TestCase
from unittest.mock import Mock, PropertyMock

class FakeClientClassTest(TestCase):
    def test_call_client(self):
        client_object = FakeClientClass()
        # 用PropertyMock模拟属性
        mock_client = Mock()
        type(mock_client).result = PropertyMock(return_value="123")
        client_object.client = mock_client

        x = client_object.call_client()
        self.assertEqual(x, "123")

        # 验证result属性被访问过
        type(mock_client).result.assert_called_once()

场景2:验证client被调用(修正原逻辑后)

如果原类逻辑修正为调用client对象,测试代码可以这么写:

from unittest import TestCase
from unittest.mock import Mock

class FakeClientClassTest(TestCase):
    def test_call_client(self):
        client_object = FakeClientClass()
        mock_client = Mock()
        # 给mock的调用返回值设置result属性
        mock_client.return_value.result = "123"
        client_object.client = mock_client

        x = client_object.call_client()
        self.assertEqual(x, "123")

        # 此时client被调用过,assert_called会通过
        mock_client.assert_called_once()

内容的提问来源于stack exchange,提问作者Devon Hume

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:45:34