| 
									
										
										
										
											2012-03-14 12:24:34 -07:00
										 |  |  | # 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)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-30 10:47:49 -07:00
										 |  |  |     def test_hierarchy(self): | 
					
						
							| 
									
										
										
										
											2012-03-14 12:24:34 -07:00
										 |  |  |         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': | 
					
						
							| 
									
										
										
										
											2012-03-14 14:40:22 -07:00
										 |  |  |             for Klass in CallableX, Sub, Multi: | 
					
						
							|  |  |  |                 with patch('%s.X' % __name__, **{arg: Klass}) as mock: | 
					
						
							| 
									
										
										
										
											2012-03-14 12:24:34 -07:00
										 |  |  |                     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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-04 11:08:45 +02:00
										 |  |  |     def test_create_autospec(self): | 
					
						
							| 
									
										
										
										
											2012-03-14 12:24:34 -07:00
										 |  |  |         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') | 
					
						
							| 
									
										
										
										
											2013-09-13 23:54:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main() |