Mocking two functions with patch for a unit test

后端 未结 3 430
陌清茗
陌清茗 2020-12-13 03:16

I have a function I want to unit test contains calls two other functions. I am unsure how can I mock both functions at the same time properly using patch. I have provided an

相关标签:
3条回答
  • 2020-12-13 03:45

    In addition to the response @Matti John you can also use patch inside function test_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
            ...
    
    0 讨论(0)
  • 2020-12-13 03:49

    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).

    0 讨论(0)
  • 2020-12-13 04:06

    Here's a simple example on how to test raising ConflictError in create_collection function using mock:

    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')
    

    Please, also see mock docs and Michael Foord's awesome introduction to mock.

    0 讨论(0)
提交回复
热议问题