mirror of https://github.com/python/cpython
gh-85934: Use getattr_static when adding mock spec (#22209)
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu> Co-authored-by: Oleg Iarygin <oleg@arhadthedev.net>
This commit is contained in:
parent
6b1510cf11
commit
2e0931046d
|
@ -38,6 +38,17 @@ class Something(object):
|
||||||
def smeth(a, b, c, d=None): pass
|
def smeth(a, b, c, d=None): pass
|
||||||
|
|
||||||
|
|
||||||
|
class SomethingElse(object):
|
||||||
|
def __init__(self):
|
||||||
|
self._instance = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def instance(self):
|
||||||
|
if not self._instance:
|
||||||
|
self._instance = 'object'
|
||||||
|
return self._instance
|
||||||
|
|
||||||
|
|
||||||
class Typos():
|
class Typos():
|
||||||
autospect = None
|
autospect = None
|
||||||
auto_spec = None
|
auto_spec = None
|
||||||
|
@ -2293,6 +2304,26 @@ class MockTest(unittest.TestCase):
|
||||||
f'{__name__}.Typos', autospect=True, set_spec=True, auto_spec=True):
|
f'{__name__}.Typos', autospect=True, set_spec=True, auto_spec=True):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def test_property_not_called_with_spec_mock(self):
|
||||||
|
obj = SomethingElse()
|
||||||
|
self.assertIsNone(obj._instance, msg='before mock')
|
||||||
|
mock = Mock(spec=obj)
|
||||||
|
self.assertIsNone(obj._instance, msg='after mock')
|
||||||
|
self.assertEqual('object', obj.instance)
|
||||||
|
|
||||||
|
def test_decorated_async_methods_with_spec_mock(self):
|
||||||
|
class Foo():
|
||||||
|
@classmethod
|
||||||
|
async def class_method(cls):
|
||||||
|
pass
|
||||||
|
@staticmethod
|
||||||
|
async def static_method():
|
||||||
|
pass
|
||||||
|
async def method(self):
|
||||||
|
pass
|
||||||
|
mock = Mock(spec=Foo)
|
||||||
|
for m in (mock.method, mock.class_method, mock.static_method):
|
||||||
|
self.assertIsInstance(m, AsyncMock)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -526,7 +526,13 @@ class NonCallableMock(Base):
|
||||||
spec_list = dir(spec)
|
spec_list = dir(spec)
|
||||||
|
|
||||||
for attr in spec_list:
|
for attr in spec_list:
|
||||||
if iscoroutinefunction(getattr(spec, attr, None)):
|
static_attr = inspect.getattr_static(spec, attr, None)
|
||||||
|
unwrapped_attr = static_attr
|
||||||
|
try:
|
||||||
|
unwrapped_attr = inspect.unwrap(unwrapped_attr)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
if iscoroutinefunction(unwrapped_attr):
|
||||||
_spec_asyncs.append(attr)
|
_spec_asyncs.append(attr)
|
||||||
|
|
||||||
spec = spec_list
|
spec = spec_list
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:mod:`unittest.mock` speccing no longer calls class properties.
|
||||||
|
Patch by Melanie Witt.
|
Loading…
Reference in New Issue