Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中unittest patch()的返回值问题_Python_Unit Testing_Mocking_Python Unittest - Fatal编程技术网

python中unittest 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对我的代码进行单元测试,但是我得到了一个奇怪的结果。这是代码的重要部分:

@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!