Python 模拟:使用 patch/MagicMock 模拟类的基本错误

问题描述 投票:0回答:1

虽然我已经成功地使用了 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'>

我已经阅读了很多参考资料和示例,但我仍然不明白我做错了什么。感觉很无知 - 有人可以帮助我吗?

python unit-testing mocking magicmock
1个回答
0
投票

这个问题实际上与这里提出的问题非常相似。

我不确定我说得是否正确,但重要的一点似乎是

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
© www.soinside.com 2019 - 2024. All rights reserved.