diff options
author | Michael Foord <michael@voidspace.org.uk> | 2014-04-15 21:21:08 (GMT) |
---|---|---|
committer | Michael Foord <michael@voidspace.org.uk> | 2014-04-15 21:21:08 (GMT) |
commit | ebc1a30d55f07d590d62504c3f097cb8a15ee7d3 (patch) | |
tree | 85c1d4b0d2efdced930ac423a207c29e569476ce /Lib/unittest/mock.py | |
parent | d943fdee87a1f3a6e2b855369c7b343d50da49ed (diff) | |
download | cpython-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.py | 15 |
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() |