我在Python 3.3中,我必須測試一個使用subprocess.py中的call
的方法。如何在單元測試中模擬subprocess.call
我想:
subprocess.call = MagicMock()
with patch('subprocess.call') as TU_call:
,但在調試模式下,我發現蟒蛇呼叫有效subprocess.call
我在Python 3.3中,我必須測試一個使用subprocess.py中的call
的方法。如何在單元測試中模擬subprocess.call
我想:
subprocess.call = MagicMock()
with patch('subprocess.call') as TU_call:
,但在調試模式下,我發現蟒蛇呼叫有效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')]
我相信這個問題是關於使用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
這種用於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")
[This thread](http://stackoverflow.com/questions/5166851/intercepting-subprocess-popen-call-in-python)可能與你的問題有關,不過它是關於python-2.x的。但我想這沒有太大的變化。 – aepsil0n
「調試模式」是什麼意思? – cfi