mirror of https://github.com/python/cpython
bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784)
This commit is contained in:
parent
b8d1262e8a
commit
66b00a9d3a
|
@ -817,6 +817,10 @@ class NonCallableMock(Base):
|
||||||
if child is None or isinstance(child, _SpecState):
|
if child is None or isinstance(child, _SpecState):
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
# If an autospecced object is attached using attach_mock the
|
||||||
|
# child would be a function with mock object as attribute from
|
||||||
|
# which signature has to be derived.
|
||||||
|
child = _extract_mock(child)
|
||||||
children = child._mock_children
|
children = child._mock_children
|
||||||
sig = child._spec_signature
|
sig = child._spec_signature
|
||||||
|
|
||||||
|
|
|
@ -1922,6 +1922,35 @@ class MockTest(unittest.TestCase):
|
||||||
self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child')
|
self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child')
|
||||||
|
|
||||||
|
|
||||||
|
def test_attach_mock_patch_autospec_signature(self):
|
||||||
|
with mock.patch(f'{__name__}.Something.meth', autospec=True) as mocked:
|
||||||
|
manager = Mock()
|
||||||
|
manager.attach_mock(mocked, 'attach_meth')
|
||||||
|
obj = Something()
|
||||||
|
obj.meth(1, 2, 3, d=4)
|
||||||
|
manager.assert_has_calls([call.attach_meth(mock.ANY, 1, 2, 3, d=4)])
|
||||||
|
obj.meth.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)])
|
||||||
|
mocked.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)])
|
||||||
|
|
||||||
|
with mock.patch(f'{__name__}.something', autospec=True) as mocked:
|
||||||
|
manager = Mock()
|
||||||
|
manager.attach_mock(mocked, 'attach_func')
|
||||||
|
something(1)
|
||||||
|
manager.assert_has_calls([call.attach_func(1)])
|
||||||
|
something.assert_has_calls([call(1)])
|
||||||
|
mocked.assert_has_calls([call(1)])
|
||||||
|
|
||||||
|
with mock.patch(f'{__name__}.Something', autospec=True) as mocked:
|
||||||
|
manager = Mock()
|
||||||
|
manager.attach_mock(mocked, 'attach_obj')
|
||||||
|
obj = Something()
|
||||||
|
obj.meth(1, 2, 3, d=4)
|
||||||
|
manager.assert_has_calls([call.attach_obj(),
|
||||||
|
call.attach_obj().meth(1, 2, 3, d=4)])
|
||||||
|
obj.meth.assert_has_calls([call(1, 2, 3, d=4)])
|
||||||
|
mocked.assert_has_calls([call(), call().meth(1, 2, 3, d=4)])
|
||||||
|
|
||||||
|
|
||||||
def test_attribute_deletion(self):
|
def test_attribute_deletion(self):
|
||||||
for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
|
for mock in (Mock(), MagicMock(), NonCallableMagicMock(),
|
||||||
NonCallableMock()):
|
NonCallableMock()):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Use signature from inner mock for autospecced methods attached with
|
||||||
|
:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan.
|
Loading…
Reference in New Issue