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

