Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
524d375f
Commit
524d375f
authored
8 years ago
by
Gregory P. Smith
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #26750: unittest.mock.create_autospec() now works properly
for subclasses of property() and other data descriptors.
parent
d331c8ec
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
51 additions
and
22 deletions
+51
-22
Lib/unittest/mock.py
Lib/unittest/mock.py
+9
-1
Lib/unittest/test/testmock/testhelpers.py
Lib/unittest/test/testmock/testhelpers.py
+39
-21
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/unittest/mock.py
View file @
524d375f
...
...
@@ -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
=
{}
...
...
This diff is collapsed.
Click to expand it.
Lib/unittest/test/testmock/testhelpers.py
View file @
524d375f
...
...
@@ -802,35 +802,53 @@ class SpecSignatureTest(unittest.TestCase):
a
.
f
.
assert_called_with
(
self
=
10
)
def
test_autospec_property
(
self
):
class
Foo
(
object
):
@
property
def
foo
(
self
):
return
3
def
test_autospec_data_descriptor
(
self
):
class
Descriptor
(
object
):
def
__init__
(
self
,
value
):
self
.
value
=
value
foo
=
create_autospec
(
Foo
)
mock_property
=
foo
.
foo
def
__get__
(
self
,
obj
,
cls
=
None
):
if
obj
is
None
:
return
self
return
self
.
value
# no spec on properties
self
.
assertIsInstance
(
mock_property
,
MagicMock
)
mock_property
(
1
,
2
,
3
)
mock_property
.
abc
(
4
,
5
,
6
)
mock_property
.
assert_called_once_with
(
1
,
2
,
3
)
mock_property
.
abc
.
assert_called_once_with
(
4
,
5
,
6
)
def
__set__
(
self
,
obj
,
value
):
pass
class
MyProperty
(
property
):
pass
def
test_autospec_slots
(
self
):
class
Foo
(
object
):
__slots__
=
[
'a'
]
__slots__
=
[
'slot'
]
@
property
def
prop
(
self
):
return
3
@
MyProperty
def
subprop
(
self
):
return
4
desc
=
Descriptor
(
42
)
foo
=
create_autospec
(
Foo
)
mock_slot
=
foo
.
a
# no spec on slots
mock_slot
(
1
,
2
,
3
)
mock_slot
.
abc
(
4
,
5
,
6
)
mock_slot
.
assert_called_once_with
(
1
,
2
,
3
)
mock_slot
.
abc
.
assert_called_once_with
(
4
,
5
,
6
)
def
check_data_descriptor
(
mock_attr
):
# Data descriptors don't have a spec.
self
.
assertIsInstance
(
mock_attr
,
MagicMock
)
mock_attr
(
1
,
2
,
3
)
mock_attr
.
abc
(
4
,
5
,
6
)
mock_attr
.
assert_called_once_with
(
1
,
2
,
3
)
mock_attr
.
abc
.
assert_called_once_with
(
4
,
5
,
6
)
# property
check_data_descriptor
(
foo
.
prop
)
# property subclass
check_data_descriptor
(
foo
.
subprop
)
# class __slot__
check_data_descriptor
(
foo
.
slot
)
# plain data descriptor
check_data_descriptor
(
foo
.
desc
)
class
TestCallList
(
unittest
.
TestCase
):
...
...
This diff is collapsed.
Click to expand it.
Misc/NEWS
View file @
524d375f
...
...
@@ -34,6 +34,9 @@ Core and Builtins
Library
-------
-
Issue
#
26750
:
unittest
.
mock
.
create_autospec
()
now
works
properly
for
subclasses
of
property
()
and
other
data
descriptors
.
-
Issue
#
27568
:
Prevent
HTTPoxy
attack
(
CVE
-
2016
-
1000110
).
Ignore
the
HTTP_PROXY
variable
when
REQUEST_METHOD
environment
is
set
,
which
indicates
that
the
script
is
in
CGI
mode
.
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment