From 6587f795fc7b46053ffbec3f20c60414ae486cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gasc=C3=B3n?= Date: Wed, 30 Oct 2019 17:26:58 +0100 Subject: [PATCH] Raise error on every patch context manager On https://github.com/pytest-dev/pytest-mock/pull/165, a change was added to raise an Exception when trying to use `mocker.patch.object` as a context manager, as its behavior is not supported in the plugin. However, the context managers for the remaining patch options (dict, multiple, and normal patch) still work as usual. With this change, we check if we are in a context manager when starting the patch, so all the methods will raise the exception if corresponds --- src/pytest_mock/plugin.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pytest_mock/plugin.py b/src/pytest_mock/plugin.py index fd039cf..5ee170e 100644 --- a/src/pytest_mock/plugin.py +++ b/src/pytest_mock/plugin.py @@ -147,6 +147,7 @@ def _start_patch(self, mock_func, *args, **kwargs): module, registering the patch to stop it later and returns the mock object resulting from the mock call. """ + self._enforce_no_with_context(inspect.stack()) p = mock_func(*args, **kwargs) mocked = p.start() self._patches.append(p) @@ -154,14 +155,9 @@ def _start_patch(self, mock_func, *args, **kwargs): self._mocks.append(mocked) return mocked - def object(self, *args, **kwargs): - """API to mock.patch.object""" - self._enforce_no_with_context(inspect.stack()) - return self._start_patch(self.mock_module.patch.object, *args, **kwargs) - def _enforce_no_with_context(self, stack): """raises a ValueError if mocker is used in a with context""" - caller = stack[1] + caller = stack[2] frame = caller[0] info = inspect.getframeinfo(frame) code_context = " ".join(info.code_context).strip() @@ -172,6 +168,10 @@ def _enforce_no_with_context(self, stack): "https://github.com/pytest-dev/pytest-mock#note-about-usage-as-context-manager" ) + def object(self, *args, **kwargs): + """API to mock.patch.object""" + return self._start_patch(self.mock_module.patch.object, *args, **kwargs) + def multiple(self, *args, **kwargs): """API to mock.patch.multiple""" return self._start_patch(self.mock_module.patch.multiple, *args, **kwargs)