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
This commit is contained in:
Xtreak 2019-03-29 02:38:43 +05:30 committed by Miss Islington (bot)
parent 3d78c4a6e5
commit 02b84cb1b4
3 changed files with 15 additions and 3 deletions

View File

@ -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)

View File

@ -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())
def test_stop_idempotent(self):
# bpo-36366: calling stop on an already stopped patch will return None.
patcher = patch(foo_name, 'bar', 3)
# calling stop without start used to produce a very obscure error
self.assertRaises(RuntimeError, patcher.stop)
patcher.start()
patcher.stop()
self.assertIsNone(patcher.stop())
def test_patchobject_start_stop(self):

View File

@ -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.