summaryrefslogtreecommitdiffstats
path: root/Lib/unittest
diff options
context:
space:
mode:
authorXtreak <tir.karthi@gmail.com>2019-03-28 21:08:43 (GMT)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-03-28 21:08:43 (GMT)
commit02b84cb1b4f5407309c81c8b1ae0397355d6e568 (patch)
treec7faa3554711f2a97b71c53699b19fb2f7f4581d /Lib/unittest
parent3d78c4a6e5ae91eaf337b6f5cc6e8bb01af7c7b1 (diff)
downloadcpython-02b84cb1b4f5407309c81c8b1ae0397355d6e568.zip
cpython-02b84cb1b4f5407309c81c8b1ae0397355d6e568.tar.gz
cpython-02b84cb1b4f5407309c81c8b1ae0397355d6e568.tar.bz2
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
Diffstat (limited to 'Lib/unittest')
-rw-r--r--Lib/unittest/mock.py2
-rw-r--r--Lib/unittest/test/testmock/testpatch.py12
2 files changed, 11 insertions, 3 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index fdde16b..8684f1d 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 c484adb..2c14360 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):