Commit 04530812 authored by Mario Corchero's avatar Mario Corchero Committed by Cheryl Sabella

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

parent eb65e244
...@@ -1556,15 +1556,24 @@ patch.dict ...@@ -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): ...@@ -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): ...@@ -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 = {}
......
Changed :func:`unittest.mock.patch.dict` to return the patched
dictionary when used as context manager. Patch by Vadim Tsander.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment