虽然我已经成功地使用了 google test 并成功地为 C++ 进行了模拟,但在 Python 中使用模拟时却一事无成。
我试图在代码中模拟一个小类,以便我可以确保特定函数的响应。我想模拟整个类,因为构造函数执行的操作涉及我想避免的依赖项。这似乎是一个相当典型且平凡的模拟用例。
但是,当我在模拟上调用该函数时,我得到的是一个
MagicMock
对象,而不是我想要的结果。举一个非常简单的例子:
class MyClass:
def value(self):
return 10
如果我想模拟
MyClass
类并更改 value
函数以使其返回不同的值,我相信我可以按如下方式执行此操作:
with patch('__main__.MyClass') as MockMyClass:
b = MyClass()
如果我随后尝试将
value
函数设置为不同的值,它不会按照我期望的方式工作,并且在模拟上调用该函数似乎会返回一个 MagicMock 对象:
>>> with patch('__main__.MyClass') as MockMyClass:
... MockMyClass.value = lambda : 22
... b = MyClass()
... print(b.value())
<MagicMock name='MyClass().value()' id='140661276636400'>
我已经阅读了很多参考资料和示例,但我仍然不明白我做错了什么。感觉很无知 - 有人可以帮助我吗?
这个问题实际上与这里提出的问题非常相似。
我不确定我说得是否正确,但重要的一点似乎是
MockMyClass
只是一个MagicMock
,但我必须改变的不是MagicMock
本身,而是在MagicMock
的返回值。
当修改为从
return_value
更改 MockMyClass
上的属性时,效果很好:
>>> with patch('__main__.MyClass') as MockMyClass:
... MockMyClass.return_value.value = lambda : 22
... b = MyClass()
... print(b.value())
...
22