mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #26750: unittest.mock.create_autospec() now works properly
for subclasses of property() and other data descriptors.
This commit is contained in:
parent
abfe28b012
commit
9854789efe
3 changed files with 51 additions and 22 deletions
|
@ -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 = {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue