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

Python Mocking疑难:使用patch/MagicMock模拟类时返回非预期MagicMock对象

Python Mock类方法时返回MagicMock而非预期值的解决方法

问题核心:你直接修改了被patch后的类的value属性,但实例化后的对象方法是由MockMyClass.return_value(即类实例的Mock对象)控制的,而非类本身的属性。

正确的配置方式

方法1:直接设置返回值

针对简单固定返回值的场景,直接指定实例方法的return_value:

from unittest.mock import patch

class MyClass:
    def value(self):
        return 10

with patch('__main__.MyClass') as MockMyClass:
    # 配置实例的value方法返回22
    MockMyClass.return_value.value.return_value = 22
    b = MyClass()
    print(b.value())  # 输出:22

方法2:使用side_effect执行自定义逻辑

如果需要动态返回值或执行额外逻辑,用side_effect绑定lambda或函数:

from unittest.mock import patch

class MyClass:
    def value(self):
        return 10

with patch('__main__.MyClass') as MockMyClass:
    MockMyClass.return_value.value.side_effect = lambda: 22
    b = MyClass()
    print(b.value())  # 输出:22

原代码问题解析

当你用patch替换MyClass后,MyClass变成了一个MagicMock类:

  • 调用MyClass()时,实际返回的是MockMyClass.return_value(默认是一个MagicMock实例)
  • 你之前修改的MockMyClass.value是类的静态属性,而实例的value方法属于MockMyClass.return_value这个对象
  • 因此直接修改类的属性不会影响实例方法的返回结果

内容的提问来源于stack exchange,提问作者Component 10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:12:24