单元测试中如何Mock类B的self.instance_a以Mock A.someFunction()?
解决Mock类B中self.instance_a及A.someFunction的问题
首先修正你代码里的小错误:B类的__init__方法缺少self参数,正确代码如下:
class A: def someFunction(self): print("does work") class B: def __init__(self): self.instance_a = A()
下面提供几种在单元测试中MockA.someFunction的方案:
方案一:Patch A类,让B初始化时自动使用Mock实例
这种方式会替换整个A类,当B创建instance_a时,得到的是Mock对象,你可以直接定义它的someFunction行为:
from unittest.mock import Mock, patch import unittest class TestB(unittest.TestCase): def test_mock_a_function(self): with patch('__main__.A') as mock_a_cls: # 创建Mock实例并设置给A类的返回值 mock_a_instance = Mock() mock_a_cls.return_value = mock_a_instance # 定义someFunction的mock行为 mock_a_instance.someFunction.return_value = "mocked result" # 初始化B,此时instance_a是我们的Mock实例 b = B() # 调用方法并验证 b.instance_a.someFunction() # 验证someFunction被调用了一次 mock_a_instance.someFunction.assert_called_once()
方案二:直接替换已创建B实例的instance_a属性
如果已经创建了B实例,直接替换它的instance_a为Mock对象即可:
from unittest.mock import Mock import unittest class TestB(unittest.TestCase): def test_replace_instance_a(self): # 创建B实例 b = B() # 创建Mock的A实例 mock_a = Mock() mock_a.someFunction.return_value = "mocked result" # 替换B的instance_a属性 b.instance_a = mock_a # 调用并验证 b.instance_a.someFunction() mock_a.someFunction.assert_called_once()
方案三:使用patch.object替换B类的instance_a属性
适合在创建B实例前,就指定它的instance_a为Mock对象:
from unittest.mock import Mock, patch import unittest class TestB(unittest.TestCase): def test_patch_b_instance_attr(self): mock_a = Mock() mock_a.someFunction.return_value = "mocked result" # Patch B类的instance_a属性 with patch.object(B, 'instance_a', new=mock_a): b = B() b.instance_a.someFunction() mock_a.someFunction.assert_called_once()
关键注意点
- 如果你是在其他模块中定义的A和B类,patch时要使用正确的模块路径,比如
patch('my_module.A')而不是__main__.A - Mock对象默认会覆盖原方法的行为,不会执行原
someFunction的打印逻辑 - 可以用
assert_called_with()验证方法是否以指定参数被调用
内容的提问来源于stack exchange,提问作者Brennan Macaig
相关产品推荐
相关产品推荐

