mirror of https://github.com/python/cpython
bpo-32299: Return patched dict when using patch.dict as a context manager (GH-11062)
This commit is contained in:
parent
eb65e2443a
commit
04530812e9
|
@ -1556,15 +1556,24 @@ patch.dict
|
||||||
decorator. When used as a class decorator :func:`patch.dict` honours
|
decorator. When used as a class decorator :func:`patch.dict` honours
|
||||||
``patch.TEST_PREFIX`` for choosing which methods to wrap.
|
``patch.TEST_PREFIX`` for choosing which methods to wrap.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.8
|
||||||
|
|
||||||
|
:func:`patch.dict` now returns the patched dictionary when used as a context
|
||||||
|
manager.
|
||||||
|
|
||||||
:func:`patch.dict` can be used to add members to a dictionary, or simply let a test
|
:func:`patch.dict` can be used to add members to a dictionary, or simply let a test
|
||||||
change a dictionary, and ensure the dictionary is restored when the test
|
change a dictionary, and ensure the dictionary is restored when the test
|
||||||
ends.
|
ends.
|
||||||
|
|
||||||
>>> foo = {}
|
>>> foo = {}
|
||||||
>>> with patch.dict(foo, {'newkey': 'newvalue'}):
|
>>> with patch.dict(foo, {'newkey': 'newvalue'}) as patched_foo:
|
||||||
... assert foo == {'newkey': 'newvalue'}
|
... assert foo == {'newkey': 'newvalue'}
|
||||||
|
... assert patched_foo == {'newkey': 'newvalue'}
|
||||||
|
... # You can add, update or delete keys of foo (or patched_foo, it's the same dict)
|
||||||
|
... patched_foo['spam'] = 'eggs'
|
||||||
...
|
...
|
||||||
>>> assert foo == {}
|
>>> assert foo == {}
|
||||||
|
>>> assert patched_foo == {}
|
||||||
|
|
||||||
>>> import os
|
>>> import os
|
||||||
>>> with patch.dict('os.environ', {'newkey': 'newvalue'}):
|
>>> with patch.dict('os.environ', {'newkey': 'newvalue'}):
|
||||||
|
|
|
@ -1730,6 +1730,7 @@ class _patch_dict(object):
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
"""Patch the dict."""
|
"""Patch the dict."""
|
||||||
self._patch_dict()
|
self._patch_dict()
|
||||||
|
return self.in_dict
|
||||||
|
|
||||||
|
|
||||||
def _patch_dict(self):
|
def _patch_dict(self):
|
||||||
|
|
|
@ -619,6 +619,13 @@ class PatchTest(unittest.TestCase):
|
||||||
self.assertEqual(foo.values, original)
|
self.assertEqual(foo.values, original)
|
||||||
|
|
||||||
|
|
||||||
|
def test_patch_dict_as_context_manager(self):
|
||||||
|
foo = {'a': 'b'}
|
||||||
|
with patch.dict(foo, a='c') as patched:
|
||||||
|
self.assertEqual(patched, {'a': 'c'})
|
||||||
|
self.assertEqual(foo, {'a': 'b'})
|
||||||
|
|
||||||
|
|
||||||
def test_name_preserved(self):
|
def test_name_preserved(self):
|
||||||
foo = {}
|
foo = {}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Changed :func:`unittest.mock.patch.dict` to return the patched
|
||||||
|
dictionary when used as context manager. Patch by Vadim Tsander.
|
Loading…
Reference in New Issue