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

Python中如何持久化Mock内部类?@patch.multiple使用难题

解决持久Mock内部类的问题

你的问题根源在于@patch.multiple装饰__init__方法时,patch的作用域仅局限于该方法执行期间,方法结束后patch会自动撤销。如果核心需求是让MockOuter实例的_inner属性始终保持Mock状态,以下是几个更优的方案:

方案1:直接替换实例属性(最简单)

不需要子类化,创建OuterClass实例后直接替换其_inner属性为Mock对象:

from unittest.mock import Mock, MagicMock

# 创建原类实例
a = OuterClass(s='MockS', b='MockB')
# 替换为Mock,可指定side_effect或return_value
a._inner = MagicMock(side_effect=mock_init)
col.append(a)

这种方式直接修改实例属性,Mock状态会一直保留,完全不受patch作用域影响。

方案2:子类化时直接初始化Mock对象

在子类MockOuter的__init__里跳过父类对InnerClass的初始化,或者初始化后直接替换,避免使用patch:

from unittest.mock import MagicMock

class MockOuter(OuterClass):
    def __init__(self, *args, **kwargs):
        # 方式1:完全自定义初始化,不调用父类的InnerClass创建逻辑
        self._b = kwargs.get('b', 'MockB')
        self._inner = MagicMock(side_effect=mock_init)
        
        # 方式2:调用父类初始化后替换_inner
        # super().__init__(s='MockS', b='MockB')
        # self._inner = MagicMock(side_effect=mock_init)

这样创建的MockOuter实例,其_inner从一开始就是Mock对象,且会一直保持该状态。

方案3:全局/类级别的patch(适合测试场景)

如果是在测试环境中,可以用patch装饰整个测试函数或测试类,让InnerClass在整个作用域内被Mock:

from unittest.mock import patch, MagicMock

@patch('your_module.InnerClass', MagicMock(side_effect=mock_init))
def test_mock_outer():
    col = []
    a = OuterClass(s='MockS', b='MockB')
    col.append(a)
    # 在此函数内,所有InnerClass的实例都是Mock对象,包括a._inner

这种方式适合需要批量Mock的测试场景,patch的作用域覆盖整个装饰的函数/类。

内容的提问来源于stack exchange,提问作者Amol Parnaik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:40:38