You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.2 KiB
151 lines
4.2 KiB
# 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()
|