Return a separate copy for each call to decorator

Similar to decorating a class, should create a separate mock copy
otherwise it acts as a caching decorator and any mock responses added
on each call will be present for subsequent calls.

Change-Id: Iabd70aa457ceb4dbc147d7cbaeec913148cb3b56
This commit is contained in:
Darragh Bailey 2017-06-19 18:50:27 +01:00
parent fcc640f495
commit d59b584d88
2 changed files with 20 additions and 4 deletions

View File

@ -61,8 +61,8 @@ class MockerCore(object):
"""
def __init__(self, **kwargs):
case_sensitive = kwargs.pop('case_sensitive', self.case_sensitive)
self._adapter = adapter.Adapter(case_sensitive=case_sensitive)
self.case_sensitive = kwargs.pop('case_sensitive', self.case_sensitive)
self._adapter = adapter.Adapter(case_sensitive=self.case_sensitive)
self._real_http = kwargs.pop('real_http', False)
self._last_send = None
@ -198,7 +198,8 @@ class Mocker(MockerCore):
"""
m = Mocker(
kw=self._kw,
real_http=self._real_http
real_http=self._real_http,
case_sensitive=self.case_sensitive
)
return m
@ -209,7 +210,7 @@ class Mocker(MockerCore):
"""
@functools.wraps(func)
def inner(*args, **kwargs):
with self as m:
with self.copy() as m:
if self._kw:
kwargs[self._kw] = m
else:

View File

@ -92,6 +92,21 @@ class MockerTests(base.TestCase):
inner()
self.assertMockStopped()
def test_with_decorator_called_multiple_times(self):
@requests_mock.Mocker()
def inner(arg1, m):
self._do_test(m)
self.assertEquals(
len(m.request_history), 1,
"Failed to provide clean mock on subsequent calls"
)
inner('a')
# if we call the same decorated method again should get
# a new request mock
inner('b')
def test_with_class_decorator(self):
outer = self