2013-10-04 53 views
10

我在Python 3.3中,我必須測試一個使用subprocess.py中的call的方法。如何在單元測試中模擬subprocess.call

我想:

subprocess.call = MagicMock() 

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

,但在調試模式下,我發現蟒蛇呼叫有效subprocess.call

+0

[This thread](http://stackoverflow.com/questions/5166851/intercepting-subprocess-popen-call-in-python)可能與你的問題有關,不過它是關於python-2.x的。但我想這沒有太大的變化。 – aepsil0n

+0

「調試模式」是什麼意思? – cfi

回答

9

工作正常,我(的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 particularmock

一般性發言,無關你的直接問題

寫到這之前我明白,這個問題是專門關於使用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' 

這種直接的方法的一大優點是,這是沒有任何包的依賴關係。缺點是如果有特定的需求,所有的決策邏輯都必須手動編碼。

作爲嘲笑軟件包的一個例子,FlexMockis available兩者的Python 2.7和Python 3. *和壓倒一切subprocess.call它的使用在this question

0

這種用於subprocess.check_output工作在python3討論

@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") 
相關問題