forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			4.4 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/
 | |
| 
 | |
| from tests.support import is_instance, unittest2, X, SomeClass
 | |
| 
 | |
| from mock import (
 | |
|     Mock, MagicMock, NonCallableMagicMock,
 | |
|     NonCallableMock, patch, create_autospec,
 | |
|     CallableMixin
 | |
| )
 | |
| 
 | |
| 
 | |
| 
 | |
| class TestCallable(unittest2.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:
 | |
|                 patcher = patch('%s.X' % __name__, **{arg: Klass})
 | |
|                 mock = patcher.start()
 | |
| 
 | |
|                 try:
 | |
|                     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)
 | |
|                 finally:
 | |
|                     patcher.stop()
 | |
| 
 | |
| 
 | |
|     def test_create_autopsec(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')
 | 
