Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions Lib/unittest/mock.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ def checksig(_mock_self, *args, **kwargs):
sig.bind(*args, **kwargs)
_copy_func_details(func, checksig)
type(mock)._mock_check_sig = checksig
type(mock).__signature__ = sig


def _copy_func_details(func, funcopy):
Expand Down Expand Up @@ -171,11 +172,11 @@ def checksig(*args, **kwargs):
return mock(*args, **kwargs)""" % name
exec (src, context)
funcopy = context[name]
_setup_func(funcopy, mock)
_setup_func(funcopy, mock, sig)
return funcopy


def _setup_func(funcopy, mock):
def _setup_func(funcopy, mock, sig):
funcopy.mock = mock

# can't use isinstance with mocks
Expand Down Expand Up @@ -223,6 +224,7 @@ def reset_mock():
funcopy.assert_called = assert_called
funcopy.assert_not_called = assert_not_called
funcopy.assert_called_once = assert_called_once
funcopy.__signature__ = sig

mock._mock_delegate = funcopy

Expand Down
30 changes: 30 additions & 0 deletions Lib/unittest/test/testmock/testhelpers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import inspect
import time
import types
import unittest
Expand Down Expand Up @@ -901,6 +902,35 @@ def __getattr__(self, attribute):
self.assertFalse(hasattr(autospec, '__name__'))


def test_spec_inspect_signature(self):

def myfunc(x, y):
pass

mock = create_autospec(myfunc)
mock(1, 2)
mock(x=1, y=2)

self.assertEqual(inspect.getfullargspec(mock), inspect.getfullargspec(myfunc))
self.assertEqual(mock.mock_calls, [call(1, 2), call(x=1, y=2)])
self.assertRaises(TypeError, mock, 1)


def test_spec_inspect_signature_annotations(self):

def foo(a: int, b: int=10, *, c:int) -> int:
return a + b + c

mock = create_autospec(foo)
mock(1, 2, c=3)
mock(1, c=3)

self.assertEqual(inspect.getfullargspec(mock), inspect.getfullargspec(foo))
self.assertEqual(mock.mock_calls, [call(1, 2, c=3), call(1, c=3)])
self.assertRaises(TypeError, mock, 1)
self.assertRaises(TypeError, mock, 1, 2, 3, c=4)


class TestCallList(unittest.TestCase):

def test_args_list_contains_call_list(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Set ``__signature__`` on mock for :mod:`inspect` to get signature.
Patch by Karthikeyan Singaravelan.