单元测试-在python中使用unittest patch()获得返回值问题



我正在尝试使用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!

最新更新