From: Xtreak Date: Thu, 28 Mar 2019 21:08:43 +0000 (+0530) Subject: bpo-36366: Return None on stopping unstarted patch object (GH-12472) X-Git-Tag: v3.8.0a4~304 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=02b84cb1b4f5407309c81c8b1ae0397355d6e568;p=python bpo-36366: Return None on stopping unstarted patch object (GH-12472) Return None after calling unittest.mock.patch.object.stop() regardless of whether the object was started. This makes the method idempotent. https://bugs.python.org/issue36366 --- diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index fdde16be03..8684f1dfa5 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1398,7 +1398,7 @@ class _patch(object): def __exit__(self, *exc_info): """Undo the patch.""" if not _is_started(self): - raise RuntimeError('stop called on unstarted patcher') + return if self.is_local and self.temp_original is not DEFAULT: setattr(self.target, self.attribute, self.temp_original) diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index c484adb605..2c14360b2d 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -772,10 +772,18 @@ class PatchTest(unittest.TestCase): def test_stop_without_start(self): + # bpo-36366: calling stop without start will return None. patcher = patch(foo_name, 'bar', 3) + self.assertIsNone(patcher.stop()) - # calling stop without start used to produce a very obscure error - self.assertRaises(RuntimeError, patcher.stop) + + def test_stop_idempotent(self): + # bpo-36366: calling stop on an already stopped patch will return None. + patcher = patch(foo_name, 'bar', 3) + + patcher.start() + patcher.stop() + self.assertIsNone(patcher.stop()) def test_patchobject_start_stop(self): diff --git a/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst b/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst new file mode 100644 index 0000000000..a43504839c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-20-15-13-18.bpo-36366.n0eav_.rst @@ -0,0 +1,4 @@ +Calling ``stop()`` on an unstarted or stopped :func:`unittest.mock.patch` +object will now return `None` instead of raising :exc:`RuntimeError`, +making the method idempotent. +Patch byKarthikeyan Singaravelan.