123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- # 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 unittest2 as unittest
- from mock.tests.support import is_instance, X, SomeClass
-
- from 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_heirarchy(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
-
- class OldStyle:
- def __call__(self):
- pass
-
- class OldStyleSub(OldStyle):
- pass
-
- for arg in 'spec', 'spec_set':
- for Klass in CallableX, Sub, Multi, OldStyle, OldStyleSub:
- 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()
|