From 6039ff3979a1bed5a5737d71dde8d0e91f4a46e1 Mon Sep 17 00:00:00 2001 From: Xtreak Date: Mon, 22 Apr 2019 08:00:23 +0530 Subject: bpo-23078: Add support for {class,static}method to mock.create_autospec() (GH-11613) Co-authored-by: Felipe Backports: 9b21856b0fcda949de239edc7aa6cf3f2f4f77a3 Signed-off-by: Chris Withers --- mock/tests/testhelpers.py | 40 +++++++++++++++++++++++++++++++++++++++- mock/tests/testmock.py | 17 +++++++++++++++++ mock/tests/testpatch.py | 20 ++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) (limited to 'mock/tests') diff --git a/mock/tests/testhelpers.py b/mock/tests/testhelpers.py index 8ff276e..e44e4ee 100644 --- a/mock/tests/testhelpers.py +++ b/mock/tests/testhelpers.py @@ -13,7 +13,7 @@ from mock import ( call, create_autospec, MagicMock, Mock, ANY, patch, PropertyMock ) -from mock.mock import _Call, _CallList +from mock.mock import _Call, _CallList, _callable from datetime import datetime from functools import partial @@ -1107,5 +1107,43 @@ class TestCallList(unittest.TestCase): self.assertNotIsInstance(returned, PropertyMock) +class TestCallablePredicate(unittest.TestCase): + + def test_type(self): + for obj in [str, bytes, int, list, tuple, SomeClass]: + self.assertTrue(_callable(obj)) + + def test_call_magic_method(self): + class Callable: + def __call__(self): + pass + instance = Callable() + self.assertTrue(_callable(instance)) + + def test_staticmethod(self): + class WithStaticMethod: + @staticmethod + def staticfunc(): + pass + self.assertTrue(_callable(WithStaticMethod.staticfunc)) + + def test_non_callable_staticmethod(self): + class BadStaticMethod: + not_callable = staticmethod(None) + self.assertFalse(_callable(BadStaticMethod.not_callable)) + + def test_classmethod(self): + class WithClassMethod: + @classmethod + def classfunc(cls): + pass + self.assertTrue(_callable(WithClassMethod.classfunc)) + + def test_non_callable_classmethod(self): + class BadClassMethod: + not_callable = classmethod(None) + self.assertFalse(_callable(BadClassMethod.not_callable)) + + if __name__ == '__main__': unittest.main() diff --git a/mock/tests/testmock.py b/mock/tests/testmock.py index dd6bfbd..ae37637 100644 --- a/mock/tests/testmock.py +++ b/mock/tests/testmock.py @@ -1482,6 +1482,23 @@ class MockTest(unittest.TestCase): m = mock.create_autospec(object(), name='sweet_func') self.assertIn('sweet_func', repr(m)) + #Issue23078 + def test_create_autospec_classmethod_and_staticmethod(self): + class TestClass: + @classmethod + def class_method(cls): + pass + + @staticmethod + def static_method(): + pass + for method in ('class_method', 'static_method'): + with self.subTest(method=method): + mock_method = mock.create_autospec(getattr(TestClass, method)) + mock_method() + mock_method.assert_called_once_with() + self.assertRaises(TypeError, mock_method, 'extra_arg') + #Issue21238 def test_mock_unsafe(self): m = Mock() diff --git a/mock/tests/testpatch.py b/mock/tests/testpatch.py index 586b1d3..bbd81fb 100644 --- a/mock/tests/testpatch.py +++ b/mock/tests/testpatch.py @@ -55,6 +55,14 @@ class Foo(object): pass foo = 'bar' + @staticmethod + def static_method(): + return 24 + + @classmethod + def class_method(cls): + return 42 + class Bar(object): def a(self): pass @@ -1025,6 +1033,18 @@ class PatchTest(unittest.TestCase): self.assertEqual(result, 3) + def test_autospec_staticmethod(self): + with patch('%s.Foo.static_method' % __name__, autospec=True) as method: + Foo.static_method() + method.assert_called_once_with() + + + def test_autospec_classmethod(self): + with patch('%s.Foo.class_method' % __name__, autospec=True) as method: + Foo.class_method() + method.assert_called_once_with() + + def test_autospec_with_new(self): patcher = patch('%s.function' % __name__, new=3, autospec=True) self.assertRaises(TypeError, patcher.start) -- cgit v1.2.3