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

