From d59b584d8806b3206c2fcb46d8469f4325626b55 Mon Sep 17 00:00:00 2001 From: Darragh Bailey Date: Mon, 19 Jun 2017 18:50:27 +0100 Subject: [PATCH] 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 --- requests_mock/mocker.py | 9 +++++---- requests_mock/tests/test_mocker.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/requests_mock/mocker.py b/requests_mock/mocker.py index 80a367f..bf207aa 100644 --- a/requests_mock/mocker.py +++ b/requests_mock/mocker.py @@ -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: diff --git a/requests_mock/tests/test_mocker.py b/requests_mock/tests/test_mocker.py index 94a37f4..16694bd 100644 --- a/requests_mock/tests/test_mocker.py +++ b/requests_mock/tests/test_mocker.py @@ -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