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
相关产品推荐
相关产品推荐

