Commit 81bc927d authored by Senthil Kumaran's avatar Senthil Kumaran

Issue #22138: Fix mock.patch behavior when patching descriptors. Restore

original values after patching.

Patch contributed by Sean McCully.
parent cbe6356c
...@@ -1332,7 +1332,10 @@ class _patch(object): ...@@ -1332,7 +1332,10 @@ class _patch(object):
setattr(self.target, self.attribute, self.temp_original) setattr(self.target, self.attribute, self.temp_original)
else: else:
delattr(self.target, self.attribute) delattr(self.target, self.attribute)
if not self.create and not hasattr(self.target, self.attribute): if not self.create and (not hasattr(self.target, self.attribute) or
self.attribute in ('__doc__', '__module__',
'__defaults__', '__annotations__',
'__kwdefaults__')):
# needed for proxy objects like django settings # needed for proxy objects like django settings
setattr(self.target, self.attribute, self.temp_original) setattr(self.target, self.attribute, self.temp_original)
......
...@@ -1817,5 +1817,31 @@ class PatchTest(unittest.TestCase): ...@@ -1817,5 +1817,31 @@ class PatchTest(unittest.TestCase):
self.assertEqual(stopped, ["three", "two", "one"]) self.assertEqual(stopped, ["three", "two", "one"])
def test_special_attrs(self):
def foo(x=0):
"""TEST"""
return x
with patch.object(foo, '__defaults__', (1, )):
self.assertEqual(foo(), 1)
self.assertEqual(foo(), 0)
with patch.object(foo, '__doc__', "FUN"):
self.assertEqual(foo.__doc__, "FUN")
self.assertEqual(foo.__doc__, "TEST")
with patch.object(foo, '__module__', "testpatch2"):
self.assertEqual(foo.__module__, "testpatch2")
self.assertEqual(foo.__module__, 'unittest.test.testmock.testpatch')
with patch.object(foo, '__annotations__', dict([('s', 1, )])):
self.assertEqual(foo.__annotations__, dict([('s', 1, )]))
self.assertEqual(foo.__annotations__, dict())
def foo(*a, x=0):
return x
with patch.object(foo, '__kwdefaults__', dict([('x', 1, )])):
self.assertEqual(foo(), 1)
self.assertEqual(foo(), 0)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -41,6 +41,9 @@ Core and Builtins ...@@ -41,6 +41,9 @@ Core and Builtins
Library Library
------- -------
- Issue #22138: Fix mock.patch behavior when patching descriptors. Restore
original values after patching. Patch contributed by Sean McCully.
- Issue #25672: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode - Issue #25672: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode
option if it is safe to do so. option if it is safe to do so.
......
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