J'ai une fonction que je veux soumettre à un test unitaire et qui appelle deux autres fonctions. Je ne suis pas sûr de pouvoir simuler les deux fonctions en même temps en utilisant patch. J'ai fourni un exemple de ce que je veux dire ci-dessous. Lorsque j'exécute nosetests, les tests passent mais je pense qu'il doit y avoir une façon plus propre de faire cela et je ne comprends pas vraiment le morceau concernant f.close()...
La structure du répertoire ressemble à ceci :
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)
Résultats :
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK