Skip to content

Commit

Permalink
Match mock.patch decorator with appropriate param
Browse files Browse the repository at this point in the history
mock.patch and mock.patch.object can be used as decorators for mocking
within the scope of the function they decorate. When there are multiple
decorators it is important the function parameters relate to the
corresponding patch objects i.e. that the parameter order matches the
decorator order.
It is easiest to explain this with an example:

@mock.patch.object(Foo, 'bar')
@mock.patch.object(SomeClass, 'some_method', some_function)
@mock.patch.object(AClass, 'a_method')
def test_some_stuff(self, mock_a_method, mock_bar):
    pass

So the decorator closest to the function definition must correspond to
the first (left-most) patch parameter. Note, if the decorator is given a
third argument, the kwarg new, then the decorated function is not
passed an extra argument by that decorator.

Change-Id: I035d71cb3b81f0c8bfd83ed81d8426cb0df31c90
  • Loading branch information
git-harry committed Nov 25, 2014
1 parent 5f5cf92 commit 65c1528
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 5 deletions.
4 changes: 2 additions & 2 deletions cinder/tests/test_nimble.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,11 +277,11 @@ def test_extend_volume(self):
'name': 'testvolume',
'sid': 'a9b9aba7'})

@mock.patch(NIMBLE_RANDOM)
@mock.patch(NIMBLE_URLLIB2)
@mock.patch(NIMBLE_CLIENT)
@NimbleDriverBaseTestCase.client_mock_decorator(create_configuration(
'nimble', 'nimble_pass', '10.18.108.55', 'default', '*', False))
@mock.patch(NIMBLE_RANDOM)
def test_create_cloned_volume(self, mock_random):
mock_random.sample.return_value = 'abcdefghijkl'
self.mock_client_service.service.snapVol.return_value = \
Expand Down Expand Up @@ -471,11 +471,11 @@ def test_initialize_connection_igroup_exist(self):
self.mock_client_service.method_calls,
expected_call_list)

@mock.patch(NIMBLE_RANDOM)
@mock.patch(NIMBLE_URLLIB2)
@mock.patch(NIMBLE_CLIENT)
@NimbleDriverBaseTestCase.client_mock_decorator(create_configuration(
'nimble', 'nimble_pass', '10.18.108.55', 'default', '*'))
@mock.patch(NIMBLE_RANDOM)
def test_initialize_connection_igroup_not_exist(self, mock_random):
mock_random.sample.return_value = 'abcdefghijkl'
self.mock_client_service.service.getInitiatorGrpList.return_value = \
Expand Down
6 changes: 3 additions & 3 deletions cinder/tests/test_volume.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,9 +323,9 @@ def fake_commit_and_rollback(context, reservations, project_id=None):
self.assertEqual(volume.status, "error")
db.volume_destroy(context.get_admin_context(), volume_id)

@mock.patch.object(QUOTAS, 'reserve')
@mock.patch.object(QUOTAS, 'commit')
@mock.patch.object(QUOTAS, 'rollback')
@mock.patch.object(QUOTAS, 'commit')
@mock.patch.object(QUOTAS, 'reserve')
def test_delete_driver_not_initialized(self, reserve, commit, rollback):
# NOTE(flaper87): Set initialized to False
self.volume.driver._initialized = False
Expand Down Expand Up @@ -1368,8 +1368,8 @@ def test_initialize_connection_fetchqos(self,
@mock.patch.object(db, 'volume_get')
@mock.patch.object(db, 'volume_update')
def test_initialize_connection_export_failure(self,
_mock_volume_get,
_mock_volume_update,
_mock_volume_get,
_mock_create_export):
"""Test exception path for create_export failure."""
_fake_admin_meta = {'fake-key': 'fake-value'}
Expand Down

0 comments on commit 65c1528

Please sign in to comment.