Issue #26750: unittest.mock.create_autospec() now works properly

for subclasses of property() and other data descriptors.
This commit is contained in:
Gregory P. Smith 2016-08-07 08:52:26 -07:00
parent abfe28b012
commit 9854789efe
3 changed files with 51 additions and 22 deletions

View file

@ -64,12 +64,20 @@ class _slotted(object):
__slots__ = ['a']
# Do not use this tuple. It was never documented as a public API.
# It will be removed. It has no obvious signs of users on github.
DescriptorTypes = (
type(_slotted.a),
property,
)
def _is_data_descriptor(obj):
# Data descriptors are Properties, slots, getsets and C data members.
return ((hasattr(obj, '__set__') or hasattr(obj, '__del__')) and
hasattr(obj, '__get__'))
def _get_signature_object(func, as_instance, eat_self):
"""
Given an arbitrary, possibly callable object, try to create a suitable
@ -2130,7 +2138,7 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None,
_kwargs.update(kwargs)
Klass = MagicMock
if type(spec) in DescriptorTypes:
if _is_data_descriptor(spec):
# descriptors don't have a spec
# because we don't know what type they return
_kwargs = {}