python中unittest patch()的返回值问题
我试图使用mock.patch对我的代码进行单元测试,但是我得到了一个奇怪的结果。这是代码的重要部分:python中unittest patch()的返回值问题,python,unit-testing,mocking,python-unittest,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_ss
@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\u value
错误,并且在错误的对象上;无论何时要设置foo()
的返回值,请使用foo.return\u value
,而不是foo().return\u value
。此外,mock_subprocess
指向subprocess.call
已经,不要在上面查找call
属性
也就是说,在设置return\u value
时不要调用mock对象,直接使用mock\u subprocess
:
您可能希望将mock_子流程
重命名为mock_子流程(call
或类似名称),以使您所修补的内容显而易见
您正在为subprocess.call.call()
,而不是subprocess.call()
,设置返回值
演示:
导入子流程
>>>从unittest.mock导入修补程序
>>>使用补丁('subprocess.call')作为模拟_子进程:
... mock_subprocess.call()。返回值='mocked!'
... 打印(subprocess.call(),subprocess.call.call())
... mock_subprocess.return_value='mocked!'
... 打印(subprocess.call())
...
嘲笑!
嘲笑!
您使用的是
mock.return\u value
错误,并且在错误的对象上;无论何时要设置foo()
的返回值,请使用foo.return\u value
,而不是foo().return\u value
。此外,mock_subprocess
指向subprocess.call
已经,不要在上面查找call
属性
也就是说,在设置return\u value
时不要调用mock对象,直接使用mock\u subprocess
:
您可能希望将mock_子流程
重命名为mock_子流程(call
或类似名称),以使您所修补的内容显而易见
您正在为subprocess.call.call()
,而不是subprocess.call()
,设置返回值
演示:
导入子流程
>>>从unittest.mock导入修补程序
>>>使用补丁('subprocess.call')作为模拟_子进程:
... mock_subprocess.call()。返回值='mocked!'
... 打印(subprocess.call(),subprocess.call.call())
... mock_subprocess.return_value='mocked!'
... 打印(subprocess.call())
...
嘲笑!
嘲笑!
你的模拟是
benchmark.scenarios.networking.feature.subprocess.call
,然后你在模拟call
方法-你只需要call
一次,模拟应该匹配import
。你的模拟是benchmark.scenarios.networking.feature.subprocess.call
,然后你在模拟调用
方法-你只需要调用
一次,模拟应该匹配导入
。
mock_subprocess.return_value = 'mocked!'
>>> 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!