summaryrefslogtreecommitdiffstats
path: root/Lib/unittest/mock.py
diff options
context:
space:
mode:
authorMichael Foord <michael@voidspace.org.uk>2014-04-15 21:21:08 (GMT)
committerMichael Foord <michael@voidspace.org.uk>2014-04-15 21:21:08 (GMT)
commitebc1a30d55f07d590d62504c3f097cb8a15ee7d3 (patch)
tree85c1d4b0d2efdced930ac423a207c29e569476ce /Lib/unittest/mock.py
parentd943fdee87a1f3a6e2b855369c7b343d50da49ed (diff)
downloadcpython-ebc1a30d55f07d590d62504c3f097cb8a15ee7d3.zip
cpython-ebc1a30d55f07d590d62504c3f097cb8a15ee7d3.tar.gz
cpython-ebc1a30d55f07d590d62504c3f097cb8a15ee7d3.tar.bz2
Closes issue 21239. unittest.mock.patch.stopall() did not work deterministically when the same name was patched multiple times.
Diffstat (limited to 'Lib/unittest/mock.py')
-rw-r--r--Lib/unittest/mock.py15
1 files changed, 10 insertions, 5 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 13fd7b1..5555774 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -1050,7 +1050,7 @@ def _is_started(patcher):
class _patch(object):
attribute_name = None
- _active_patches = set()
+ _active_patches = []
def __init__(
self, getter, attribute, new, spec, create,
@@ -1323,13 +1323,18 @@ class _patch(object):
def start(self):
"""Activate a patch, returning any created mock."""
result = self.__enter__()
- self._active_patches.add(self)
+ self._active_patches.append(self)
return result
def stop(self):
"""Stop an active patch."""
- self._active_patches.discard(self)
+ try:
+ self._active_patches.remove(self)
+ except ValueError:
+ # If the patch hasn't been started this will fail
+ pass
+
return self.__exit__()
@@ -1622,8 +1627,8 @@ def _clear_dict(in_dict):
def _patch_stopall():
- """Stop all active patches."""
- for patch in list(_patch._active_patches):
+ """Stop all active patches. LIFO to unroll nested patches."""
+ for patch in reversed(_patch._active_patches):
patch.stop()