Ich habe eine Funktion, die ich Unit-Test möchte Aufrufe zwei weitere Funktionen enthält. Ich bin mir nicht sicher, wie ich beide Funktionen gleichzeitig mit Patch richtig verspotten kann. Ich habe ein Beispiel dafür gegeben, was ich unten meine. Wenn ich Nasentests durchführe, bestehen die Tests, aber ich bin der Meinung, dass es einen saubereren Weg geben muss, und ich verstehe das Stück in Bezug auf f.close () nicht wirklich ...
Die Verzeichnisstruktur sieht folgendermaßen aus:
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)
Ergebnisse:
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK