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
Antworten:
Sie können Ihren Test vereinfachen, indem Sie den Patch-Dekorator verwenden und sie wie folgt verschachteln (sie sind
MagicMock
standardmäßig Objekte):@patch('cPickle.dump') @patch('__builtin__.open') def test_write_out(mock_open, mock_pickle): path = '~/collection' f = mock_open.return_value f.method.return_value = path write_out(path, 'data') mock_open.assert_called_once_with('~/collection', 'wb') mock_pickle.assert_called_once_with('data', f) f.close.assert_any_call()
Aufrufe einer
MagicMock
Instanz geben eine neueMagicMock
Instanz zurück, sodass Sie überprüfen können, ob der zurückgegebene Wert wie jedes andere verspottete Objekt aufgerufen wurde. In diesem Fallf
ist einMagicMock
benannter'open()'
(versuchen Sie zu druckenf
).quelle
Zusätzlich zur Antwort @Matti John können Sie auch die
patch
Inside-Funktion verwendentest_write_out
:from mock import MagicMock, patch def test_write_out(): path = '~/collection' with patch('__builtin__.open') as mock_open, \ patch('cPickle.dump') as mock_pickle: f = mock_open.return_value ...
quelle
Hier ist ein einfaches Beispiel, wie man Test Erhöhung
ConflictError
increate_collection
Funktion Mock mit:import os from unittest import TestCase from mock import patch from ..program.data import ConflictError, create_collection class TestCreateCollection(TestCase): def test_path_exists(self): with patch.object(os.path, 'exists') as mock_method: mock_method.return_value = True self.assertRaises(ConflictError, create_collection, 'test')
Bitte lesen Sie auch die Mock-Dokumente und Michael Foords großartige Einführung in das Mock .
quelle