bpo-32299: Return patched dict when using patch.dict as a context manager (GH-11062)

This commit is contained in:
Mario Corchero 2019-05-28 13:53:31 +01:00 committed by Cheryl Sabella
parent eb65e2443a
commit 04530812e9
4 changed files with 20 additions and 1 deletions

View File

@ -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'}):

View File

@ -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):

View File

@ -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 = {}

View File

@ -0,0 +1,2 @@
Changed :func:`unittest.mock.patch.dict` to return the patched
dictionary when used as context manager. Patch by Vadim Tsander.