
This issue trackerhas been migrated toGitHub, and is currentlyread-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.
Created on2019-10-14 14:25 byxtreak, last changed2022-04-11 14:59 byadmin. This issue is nowclosed.
| Pull Requests | |||
|---|---|---|---|
| URL | Status | Linked | Edit |
| PR 16784 | merged | xtreak,2019-10-14 15:54 | |
| PR 18166 | merged | miss-islington,2020-01-24 13:20 | |
| PR 18167 | merged | miss-islington,2020-01-24 13:21 | |
| Messages (5) | |||
|---|---|---|---|
| msg354635 -(view) | Author: Karthikeyan Singaravelan (xtreak)*![]() | Date: 2019-10-14 14:25 | |
The following program causes AttributeError while retrieving the spec signature of a call. It seems that not all mocks specced should have _spec_signature where if autospec is used and the mock is attached with attach_mock then the "mock" attribute has the correct object from which _spec_signature has to be derived. On the attribute being not present we can fallback to the sig being None. This can be workaround by disabling autospec but since this is present in 3.7.5RC1 and 3.8.0RC1 I am tagging it as regression. I am also attaching a patch with script to reproduce this that should pass with the patch. I will try to make a PR tonight. Sorry for the last minute report I just stumbled upon this while debugginghttps://bugs.python.org/issue21478#msg354489. This change was introduced as part ofhttps://bugs.python.org/issue36871 by me. I am tagging the nosy list from issue for review of the patch.import unittestfrom unittest.mock import patch, Mock, call, ANYclass Foo: def set_foo(self, val): passclass FooTest(unittest.TestCase): @patch(f"{__name__}.Foo.set_foo", autospec=True) def test_autospec_attach_mock_assert(self, mock_set_foo): manager = Mock() manager.attach_mock(mock_set_foo, "set_foo_func") obj = Foo() obj.set_foo(3) manager.assert_has_calls([call.set_foo_func(ANY, 3)])if __name__ == "__main__": unittest.main()➜ Python-3.7.5rc1 ./python autospec_regression.pyE======================================================================ERROR: test_autospec_attach_mock_assert (__main__.FooTest)----------------------------------------------------------------------Traceback (most recent call last): File "/home/xtreak/Python-3.7.5rc1/Lib/unittest/mock.py", line 1255, in patched return func(*args, **keywargs) File "autospec_regression.py", line 16, in test_autospec_attach_mock_assert manager.assert_has_calls([call.set_foo_func(ANY, 3)]) File "/home/xtreak/Python-3.7.5rc1/Lib/unittest/mock.py", line 897, in assert_has_calls expected = [self._call_matcher(c) for c in calls] File "/home/xtreak/Python-3.7.5rc1/Lib/unittest/mock.py", line 897, in <listcomp> expected = [self._call_matcher(c) for c in calls] File "/home/xtreak/Python-3.7.5rc1/Lib/unittest/mock.py", line 812, in _call_matcher sig = self._get_call_signature_from_name(_call[0]) File "/home/xtreak/Python-3.7.5rc1/Lib/unittest/mock.py", line 798, in _get_call_signature_from_name sig = child._spec_signatureAttributeError: 'function' object has no attribute '_spec_signature'----------------------------------------------------------------------Ran 1 test in 0.003sFAILED (errors=1)Patch : ➜ Python-3.7.5rc1 diff -uLib/unittest/mock.pyLib/unittest/mock_patched.py---Lib/unittest/mock.py2019-10-01 22:53:17.000000000 +0530+++Lib/unittest/mock_patched.py2019-10-14 19:18:00.038416294 +0530@@ -795,7 +795,16 @@ break else: children = child._mock_children- sig = child._spec_signature+ # 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. If there is no signature+ # attribute then fallback to None to ensure old signature is + # not used.+ child = _extract_mock(child)+ try:+ sig = child._spec_signature+ except AttributeError:+ sig = None return sig | |||
| msg360616 -(view) | Author: Chris Withers (cjw296)*![]() | Date: 2020-01-24 13:14 | |
New changeset66b00a9d3aacf6ed49412f48743e4913104a2bb3 by Chris Withers (Karthikeyan Singaravelan) in branch 'master':bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784)https://github.com/python/cpython/commit/66b00a9d3aacf6ed49412f48743e4913104a2bb3 | |||
| msg360688 -(view) | Author: Karthikeyan Singaravelan (xtreak)*![]() | Date: 2020-01-25 14:53 | |
New changeseta5906b2bfce9560568dee1dcc3550e74e742dd34 by Karthikeyan Singaravelan (Miss Islington (bot)) in branch '3.8':bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) (GH-18167)https://github.com/python/cpython/commit/a5906b2bfce9560568dee1dcc3550e74e742dd34 | |||
| msg360689 -(view) | Author: Karthikeyan Singaravelan (xtreak)*![]() | Date: 2020-01-25 14:55 | |
New changeset71d2b3344f4560ffee14fccd320b20e7add50fec by Karthikeyan Singaravelan (Miss Islington (bot)) in branch '3.7':bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) (#18166)https://github.com/python/cpython/commit/71d2b3344f4560ffee14fccd320b20e7add50fec | |||
| msg360690 -(view) | Author: Karthikeyan Singaravelan (xtreak)*![]() | Date: 2020-01-25 14:56 | |
Thank you all for the review. Closing it as fixed. | |||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-04-11 14:59:21 | admin | set | github: 82654 |
| 2020-01-25 14:56:39 | xtreak | set | status: open -> closed resolution: fixed messages: +msg360690 stage: patch review -> resolved |
| 2020-01-25 14:55:01 | xtreak | set | messages: +msg360689 |
| 2020-01-25 14:53:11 | xtreak | set | messages: +msg360688 |
| 2020-01-24 13:21:04 | miss-islington | set | pull_requests: +pull_request17553 |
| 2020-01-24 13:20:56 | miss-islington | set | pull_requests: +pull_request17552 |
| 2020-01-24 13:14:33 | cjw296 | set | messages: +msg360616 |
| 2019-10-14 17:56:10 | gregory.p.smith | set | type: behavior |
| 2019-10-14 15:54:14 | xtreak | set | keywords: +patch stage: patch review pull_requests: +pull_request16344 |
| 2019-10-14 14:25:09 | xtreak | create | |