Ho una funzione che voglio test dell'unità contiene chiamate altre due funzioni. Non sono sicuro di come possa prendere in giro entrambe le funzioni allo stesso tempo usando correttamente la patch. Ho fornito un esempio di cosa intendo di seguito. Quando eseguo nosetests, i test passano ma sento che ci deve essere un modo più pulito per fare questo e in realtà non capisco il pezzo riguardante f.close() ...Mocking di due funzioni con patch per un test di unità
La struttura di directory è simile a questa:
program/
program/
data.py
tests/
data_test.py
data.py:
import cPickle
def write_out(file_path, data):
f = open(file_path, 'wb')
cPickle.dump(data, f)
f.close()
data_test.py:
from mock import MagicMock, patch
def test_write_out():
path = '~/collection'
mock_open = MagicMock()
mock_pickle = MagicMock()
f_mock = MagicMock()
with patch('__builtin__.open', mock_open):
f = mock_open.return_value
f.method.return_value = path
with patch('cPickle.dump', mock_pickle):
write_out(path, 'data')
mock_open.assert_called_once_with('~/collection', 'wb')
f.close.assert_any_call()
mock_pickle.assert_called_once_with('data', f)
Risultati:
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK
Credo che la mia domanda iniziale era chiaro così ho ripulito. Spero che questo mostri quello che sto cercando più precisamente! – cnodell