2013-10-04 10 views
10

Sono su python 3.3 e devo testare un metodo che usa call da subprocess.py.come simulare subprocess.call in un unestest

ho provato:

subprocess.call = MagicMock() 

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

ma in modalità debug ho scoperto che la chiamata python efficacemente subprocess.call

+0

[Questo thread] (http://stackoverflow.com/questions/5166851/intercepting-subprocess-popen-call-in-python) potrebbe essere pertinente alla tua domanda, sebbene riguardi python-2.x. Ma immagino che non ci siano stati molti cambiamenti. – aepsil0n

+0

Cosa intendete in particolare con "modalità di debug"? – cfi

risposta

9

funziona bene per me (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')] 

Credo che questa domanda riguardi l'utilizzo del pacchetto this particularmock

dichiarazioni generali, non correlate alla tua domanda diretta

scritto questo prima ho capito che la questione è specificamente l'uso del pacchetto finto pitone.

Un modo generale per deridere funzioni è ridefinire esplicitamente la funzione o il metodo:

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

Il grande vantaggio di questo approccio diretto è che questo è privo di dipendenze. Lo svantaggio è che se ci sono esigenze specifiche, tutta la logica decisionale deve essere codificata manualmente.

Come esempio di pacchetti scherno, FlexMockis available sia Python 2.7 e Python 3. * e il suo utilizzo imperativo subprocess.call è discusso in this question

0

Questo lavoro per subprocess.check_output in 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")