Mocking two functions with patch for a unit test
You can simplify your test by using the patch decorator and nesting them like so (they are MagicMock
objects by default):
@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()
Calls to a MagicMock
instance return a new MagicMock
instance, so you can check that the returned value was called just like any other mocked object. In this case f
is a MagicMock
named 'open()'
(try printing f
).
In addition to the response @Matti John you can also use patch
inside function test_write_out
:
from mock import MagicMock, patchdef test_write_out(): path = '~/collection' with patch('__builtin__.open') as mock_open, \ patch('cPickle.dump') as mock_pickle: f = mock_open.return_value ...
Here's a simple example on how to test raising ConflictError
in create_collection
function using mock:
import osfrom unittest import TestCasefrom mock import patchfrom ..program.data import ConflictError, create_collectionclass 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')
Please, also see mock docs and Michael Foord's awesome introduction to mock.