Zombando duas funções com patch para um teste de unidade

Eu tenho uma função que eu quero teste de unidade contém chamadas duas outras funções. Não tenho certeza de como posso simular ambas as funções ao mesmo tempo usando corretamente o patch. Eu forneci um exemplo do que quero dizer abaixo. Quando eu corro nosetests, os testes passam, mas eu sinto que deve haver uma maneira mais limpa para fazer isso e eu realmente não entendo a peça sobre f.close () ...

A estrutura do diretório se parece com isso:

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)

Resultados:

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

questionAnswers(3)

yourAnswerToTheQuestion