[3.11] gh-96127: Fix inspect.signature call on mocks (#96335) (#101646)

(cherry picked from commit 9e7d7266ec)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
This commit is contained in:
Oleg Iarygin 2023-02-08 14:05:57 +04:00 committed by GitHub
parent c38b4e75b1
commit efcab38699
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 1 deletions

View file

@ -3238,6 +3238,25 @@ def test_signature_on_lambdas(self):
((('a', 10, ..., "positional_or_keyword"),),
...))
def test_signature_on_mocks(self):
# https://github.com/python/cpython/issues/96127
for mock in (
unittest.mock.Mock(),
unittest.mock.AsyncMock(),
unittest.mock.MagicMock(),
):
with self.subTest(mock=mock):
self.assertEqual(str(inspect.signature(mock)), '(*args, **kwargs)')
def test_signature_on_noncallable_mocks(self):
for mock in (
unittest.mock.NonCallableMock(),
unittest.mock.NonCallableMagicMock(),
):
with self.subTest(mock=mock):
with self.assertRaises(TypeError):
inspect.signature(mock)
def test_signature_equality(self):
def foo(a, *, b:int) -> float: pass
self.assertFalse(inspect.signature(foo) == 42)

View file

@ -2201,7 +2201,15 @@ def __init__(self, /, *args, **kwargs):
self.__dict__['_mock_await_args'] = None
self.__dict__['_mock_await_args_list'] = _CallList()
code_mock = NonCallableMock(spec_set=CodeType)
code_mock.co_flags = inspect.CO_COROUTINE
code_mock.co_flags = (
inspect.CO_COROUTINE
+ inspect.CO_VARARGS
+ inspect.CO_VARKEYWORDS
)
code_mock.co_argcount = 0
code_mock.co_varnames = ('args', 'kwargs')
code_mock.co_posonlyargcount = 0
code_mock.co_kwonlyargcount = 0
self.__dict__['__code__'] = code_mock
self.__dict__['__name__'] = 'AsyncMock'
self.__dict__['__defaults__'] = tuple()

View file

@ -0,0 +1,2 @@
``inspect.signature`` was raising ``TypeError`` on call with mock objects.
Now it correctly returns ``(*args, **kwargs)`` as infered signature.