mirror of
https://github.com/python/cpython.git
synced 2025-07-21 02:05:20 +00:00

This was achieved by: * moving many pass statements in tests onto their own lines, so they pass line coverage and can match an easy ignore pattern if branch coverage is added later. * removing code that cannot be reached. * removing long-disabled tests. * removing unused code. * adding tests for uncovered code It turned out that removing `if __name__ == '__main__'` blocks that run unittest.main() at the bottom of test files was surprisingly contentious, so they remain and can be filtered out with an appropriate .coveragerc.
150 lines
4.2 KiB
Python
150 lines
4.2 KiB
Python
# Copyright (C) 2007-2012 Michael Foord & the mock team
|
|
# E-mail: fuzzyman AT voidspace DOT org DOT uk
|
|
# http://www.voidspace.org.uk/python/mock/
|
|
|
|
import unittest
|
|
from unittest.test.testmock.support import is_instance, X, SomeClass
|
|
|
|
from unittest.mock import (
|
|
Mock, MagicMock, NonCallableMagicMock,
|
|
NonCallableMock, patch, create_autospec,
|
|
CallableMixin
|
|
)
|
|
|
|
|
|
|
|
class TestCallable(unittest.TestCase):
|
|
|
|
def assertNotCallable(self, mock):
|
|
self.assertTrue(is_instance(mock, NonCallableMagicMock))
|
|
self.assertFalse(is_instance(mock, CallableMixin))
|
|
|
|
|
|
def test_non_callable(self):
|
|
for mock in NonCallableMagicMock(), NonCallableMock():
|
|
self.assertRaises(TypeError, mock)
|
|
self.assertFalse(hasattr(mock, '__call__'))
|
|
self.assertIn(mock.__class__.__name__, repr(mock))
|
|
|
|
|
|
def test_hierarchy(self):
|
|
self.assertTrue(issubclass(MagicMock, Mock))
|
|
self.assertTrue(issubclass(NonCallableMagicMock, NonCallableMock))
|
|
|
|
|
|
def test_attributes(self):
|
|
one = NonCallableMock()
|
|
self.assertTrue(issubclass(type(one.one), Mock))
|
|
|
|
two = NonCallableMagicMock()
|
|
self.assertTrue(issubclass(type(two.two), MagicMock))
|
|
|
|
|
|
def test_subclasses(self):
|
|
class MockSub(Mock):
|
|
pass
|
|
|
|
one = MockSub()
|
|
self.assertTrue(issubclass(type(one.one), MockSub))
|
|
|
|
class MagicSub(MagicMock):
|
|
pass
|
|
|
|
two = MagicSub()
|
|
self.assertTrue(issubclass(type(two.two), MagicSub))
|
|
|
|
|
|
def test_patch_spec(self):
|
|
patcher = patch('%s.X' % __name__, spec=True)
|
|
mock = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
instance = mock()
|
|
mock.assert_called_once_with()
|
|
|
|
self.assertNotCallable(instance)
|
|
self.assertRaises(TypeError, instance)
|
|
|
|
|
|
def test_patch_spec_set(self):
|
|
patcher = patch('%s.X' % __name__, spec_set=True)
|
|
mock = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
instance = mock()
|
|
mock.assert_called_once_with()
|
|
|
|
self.assertNotCallable(instance)
|
|
self.assertRaises(TypeError, instance)
|
|
|
|
|
|
def test_patch_spec_instance(self):
|
|
patcher = patch('%s.X' % __name__, spec=X())
|
|
mock = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
self.assertNotCallable(mock)
|
|
self.assertRaises(TypeError, mock)
|
|
|
|
|
|
def test_patch_spec_set_instance(self):
|
|
patcher = patch('%s.X' % __name__, spec_set=X())
|
|
mock = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
self.assertNotCallable(mock)
|
|
self.assertRaises(TypeError, mock)
|
|
|
|
|
|
def test_patch_spec_callable_class(self):
|
|
class CallableX(X):
|
|
def __call__(self): pass
|
|
|
|
class Sub(CallableX):
|
|
pass
|
|
|
|
class Multi(SomeClass, Sub):
|
|
pass
|
|
|
|
for arg in 'spec', 'spec_set':
|
|
for Klass in CallableX, Sub, Multi:
|
|
with patch('%s.X' % __name__, **{arg: Klass}) as mock:
|
|
instance = mock()
|
|
mock.assert_called_once_with()
|
|
|
|
self.assertTrue(is_instance(instance, MagicMock))
|
|
# inherited spec
|
|
self.assertRaises(AttributeError, getattr, instance,
|
|
'foobarbaz')
|
|
|
|
result = instance()
|
|
# instance is callable, result has no spec
|
|
instance.assert_called_once_with()
|
|
|
|
result(3, 2, 1)
|
|
result.assert_called_once_with(3, 2, 1)
|
|
result.foo(3, 2, 1)
|
|
result.foo.assert_called_once_with(3, 2, 1)
|
|
|
|
|
|
def test_create_autospec(self):
|
|
mock = create_autospec(X)
|
|
instance = mock()
|
|
self.assertRaises(TypeError, instance)
|
|
|
|
mock = create_autospec(X())
|
|
self.assertRaises(TypeError, mock)
|
|
|
|
|
|
def test_create_autospec_instance(self):
|
|
mock = create_autospec(SomeClass, instance=True)
|
|
|
|
self.assertRaises(TypeError, mock)
|
|
mock.wibble()
|
|
mock.wibble.assert_called_once_with()
|
|
|
|
self.assertRaises(TypeError, mock.wibble, 'some', 'args')
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|