我在 python 3.3 上,我必须测试一个call
从 subprocess.py 使用的方法。
我试过了:
subprocess.call = MagicMock()
with patch('subprocess.call') as TU_call:
但是在调试模式下我发现python调用有效subprocess.call
我在 python 3.3 上,我必须测试一个call
从 subprocess.py 使用的方法。
我试过了:
subprocess.call = MagicMock()
with patch('subprocess.call') as TU_call:
但是在调试模式下我发现python调用有效subprocess.call
对我来说很好(Ubuntu 13.04,Python 3.3.1):
$ python3.3
Python 3.3.1 (default, Sep 25 2013, 19:29:01)
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mock
>>> import subprocess
>>> result = subprocess.call('date')
Fri Jan 3 19:45:32 CET 2014
>>> subprocess.call = mock.create_autospec(subprocess.call, return_value='mocked!')
>>> result = subprocess.call('date')
>>> print(result)
mocked!
>>> subprocess.call.mock_calls
[call('date')]
我相信这个问题是关于这个特定 mock
包的使用
一般陈述,与您的直接问题无关
在我理解这个问题专门关于 python 模拟包的使用之前写了这个。
模拟函数的一种通用方法是显式地重新定义函数或方法:
$ python3.3
Python 3.3.1 (default, Sep 25 2013, 19:29:01)
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call('date')
Fri Jan 3 19:23:25 CET 2014
0
>>> def mocked_call(*a, **kw):
... return 'mocked'
...
>>> subprocess.call = mocked_call
>>> subprocess.call('date')
'mocked'
这种直接方法的最大优点是它没有任何包依赖性。缺点是如果有特定的需求,所有的决策逻辑都必须手动编码。
作为模拟包的示例,FlexMock 可用于 Python 2.7 和 Python 3.*,并且在此问题subprocess.call
中讨论了它的覆盖用法
这适用于 python3 中的 subprocess.check_output
@mock.patch('subprocess.check_output', mock.mock_open())
@mock.patch('subprocess.Popen.communicate')
def tst_prepare_data_for_matrices(self, makedirs_mock, check_output_mock):
config_file = open(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)+'/etc/test/config.json')).read()
check_output_mock.return_value = ("output", "Error")