Mocking dwóch funkcji za pomocą łaty do testu jednostkowego

Mam funkcję, którą chcę przetestować, zawiera dwie inne funkcje. Nie jestem pewien, w jaki sposób mogę jednocześnie wyszydzić obie funkcje, używając poprawek. Podałem przykład tego, co mam na myśli poniżej. Kiedy przeprowadzam testy nosa, testy przechodzą, ale czuję, że musi być jakiś lepszy sposób, aby to zrobić, a ja naprawdę nie rozumiem fragmentu dotyczącego f.close () ...

Struktura katalogów wygląda następująco:

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)

Wyniki:

$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK

questionAnswers(3)

yourAnswerToTheQuestion