我正在尝试使用mock。补丁单元测试我的代码,但我得到一个奇怪的结果。这是代码的重要部分:
@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'>
我做错了什么?我想被嘲笑!
您使用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!