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

单元测试中如何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:12:33