我正在尝试使用mock.patch对我的代码进行单元测试,但是我得到了一个奇怪的结果。这是代码的重要部分:
@mock.patch('benchmark.scenarios.networking.feature.ssh')
@mock.patch('benchmark.scenarios.networking.feature.subprocess.call')
def test_run_for_success(self, mock_subprocess, mock_ssh):
mock_ssh.SSH().execute.return_value = (0, '100', '')
mock_subprocess.call().return_value = 'mocked!'
result = {}
self.feature.run(result)
当我在代码中运行ssh时,我得到了返回值:(0, '100', '')
,好!但是,当我运行subprocess.call()
时,我得到了返回值:
<MagicMock name='subprocess.call()' id='139806699670096'>
我做错了什么?我想被嘲笑!&#39;作为返回值。
答案 0 :(得分:3)
您使用mock.return_value
错误,并使用了错误的对象;只要您想为foo()
设置返回值,请使用foo.return_value
,而不是foo().return_value
。此外,mock_subprocess
指向subprocess.call
已经,不要在其上查找call
属性!
换句话说,在设置return_value
时不要调用模拟对象,并直接使用mock_subprocess
:
mock_subprocess.return_value = 'mocked!'
您可能希望将mock_subprocess
重命名为mock_subprocess_call
或类似名称,以便明确修改内容。
您设置了subprocess.call.call()()
的返回值,而不是subprocess.call()
。
演示:
>>> import subprocess
>>> from unittest.mock import patch
>>> with patch('subprocess.call') as mock_subprocess:
... mock_subprocess.call().return_value = 'mocked!'
... print(subprocess.call(), subprocess.call.call()())
... mock_subprocess.return_value = 'mocked!'
... print(subprocess.call())
...
<MagicMock name='call()' id='4557171960'> mocked!
mocked!