如何在unittest中模拟subprocess.call

时间:2013-10-04 11:12:12

标签: unit-testing python-3.x mocking

我正在使用python 3.3,我必须测试一个使用subprocess.py中的call的方法。

我试过了:

subprocess.call = MagicMock()

with patch('subprocess.call') as TU_call:

但在调试模式下,我发现python有效地调用了subprocess.call

2 个答案:

答案 0 :(得分:10)

适合我(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')]

我认为这个问题与this particular mock

的使用有关

与您的直接问题无关的一般性陈述

在我明白问题是关于使用python mock包之前写了这个。

模拟函数的一种通用方法是显式重新定义函数或方法:

$ 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'

这种简单方法的一大优点是它没有任何包依赖性。缺点是如果有特定需求,所有决策逻辑都必须手动编码。

作为模拟软件包的示例,{2.7}和Python 3 *的FlexMock is available及其覆盖subprocess.call的用法在this question中讨论

答案 1 :(得分:0)

这适用于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")