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:
parent
3d78c4a6e5
commit
02b84cb1b4
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue