使用python中的unittest patch()获取返回值问题

时间:2016-07-04 15:56:13

标签: python unit-testing mocking python-unittest

我正在尝试使用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;作为返回值。

1 个答案:

答案 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!