mirror of https://github.com/python/cpython
merge from 3.5
Issue #22138: Fix mock.patch behavior when patching descriptors. Restore original values after patching. Patch contributed by Sean McCully.
This commit is contained in:
commit
b94591c2bf
|
@ -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):
|
||||||
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()
|
||||||
|
|
|
@ -128,6 +128,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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue