(root)/
Python-3.12.0/
Lib/
test/
test_unittest/
testmock/
testcallable.py
       1  # Copyright (C) 2007-2012 Michael Foord & the mock team
       2  # E-mail: fuzzyman AT voidspace DOT org DOT uk
       3  # http://www.voidspace.org.uk/python/mock/
       4  
       5  import unittest
       6  from test.test_unittest.testmock.support import is_instance, X, SomeClass
       7  
       8  from unittest.mock import (
       9      Mock, MagicMock, NonCallableMagicMock,
      10      NonCallableMock, patch, create_autospec,
      11      CallableMixin
      12  )
      13  
      14  
      15  
      16  class ESC[4;38;5;81mTestCallable(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      17  
      18      def assertNotCallable(self, mock):
      19          self.assertTrue(is_instance(mock, NonCallableMagicMock))
      20          self.assertFalse(is_instance(mock, CallableMixin))
      21  
      22  
      23      def test_non_callable(self):
      24          for mock in NonCallableMagicMock(), NonCallableMock():
      25              self.assertRaises(TypeError, mock)
      26              self.assertFalse(hasattr(mock, '__call__'))
      27              self.assertIn(mock.__class__.__name__, repr(mock))
      28  
      29  
      30      def test_hierarchy(self):
      31          self.assertTrue(issubclass(MagicMock, Mock))
      32          self.assertTrue(issubclass(NonCallableMagicMock, NonCallableMock))
      33  
      34  
      35      def test_attributes(self):
      36          one = NonCallableMock()
      37          self.assertTrue(issubclass(type(one.one), Mock))
      38  
      39          two = NonCallableMagicMock()
      40          self.assertTrue(issubclass(type(two.two), MagicMock))
      41  
      42  
      43      def test_subclasses(self):
      44          class ESC[4;38;5;81mMockSub(ESC[4;38;5;149mMock):
      45              pass
      46  
      47          one = MockSub()
      48          self.assertTrue(issubclass(type(one.one), MockSub))
      49  
      50          class ESC[4;38;5;81mMagicSub(ESC[4;38;5;149mMagicMock):
      51              pass
      52  
      53          two = MagicSub()
      54          self.assertTrue(issubclass(type(two.two), MagicSub))
      55  
      56  
      57      def test_patch_spec(self):
      58          patcher = patch('%s.X' % __name__, spec=True)
      59          mock = patcher.start()
      60          self.addCleanup(patcher.stop)
      61  
      62          instance = mock()
      63          mock.assert_called_once_with()
      64  
      65          self.assertNotCallable(instance)
      66          self.assertRaises(TypeError, instance)
      67  
      68  
      69      def test_patch_spec_set(self):
      70          patcher = patch('%s.X' % __name__, spec_set=True)
      71          mock = patcher.start()
      72          self.addCleanup(patcher.stop)
      73  
      74          instance = mock()
      75          mock.assert_called_once_with()
      76  
      77          self.assertNotCallable(instance)
      78          self.assertRaises(TypeError, instance)
      79  
      80  
      81      def test_patch_spec_instance(self):
      82          patcher = patch('%s.X' % __name__, spec=X())
      83          mock = patcher.start()
      84          self.addCleanup(patcher.stop)
      85  
      86          self.assertNotCallable(mock)
      87          self.assertRaises(TypeError, mock)
      88  
      89  
      90      def test_patch_spec_set_instance(self):
      91          patcher = patch('%s.X' % __name__, spec_set=X())
      92          mock = patcher.start()
      93          self.addCleanup(patcher.stop)
      94  
      95          self.assertNotCallable(mock)
      96          self.assertRaises(TypeError, mock)
      97  
      98  
      99      def test_patch_spec_callable_class(self):
     100          class ESC[4;38;5;81mCallableX(ESC[4;38;5;149mX):
     101              def __call__(self): pass
     102  
     103          class ESC[4;38;5;81mSub(ESC[4;38;5;149mCallableX):
     104              pass
     105  
     106          class ESC[4;38;5;81mMulti(ESC[4;38;5;149mSomeClass, ESC[4;38;5;149mSub):
     107              pass
     108  
     109          for arg in 'spec', 'spec_set':
     110              for Klass in CallableX, Sub, Multi:
     111                  with patch('%s.X' % __name__, **{arg: Klass}) as mock:
     112                      instance = mock()
     113                      mock.assert_called_once_with()
     114  
     115                      self.assertTrue(is_instance(instance, MagicMock))
     116                      # inherited spec
     117                      self.assertRaises(AttributeError, getattr, instance,
     118                                        'foobarbaz')
     119  
     120                      result = instance()
     121                      # instance is callable, result has no spec
     122                      instance.assert_called_once_with()
     123  
     124                      result(3, 2, 1)
     125                      result.assert_called_once_with(3, 2, 1)
     126                      result.foo(3, 2, 1)
     127                      result.foo.assert_called_once_with(3, 2, 1)
     128  
     129  
     130      def test_create_autospec(self):
     131          mock = create_autospec(X)
     132          instance = mock()
     133          self.assertRaises(TypeError, instance)
     134  
     135          mock = create_autospec(X())
     136          self.assertRaises(TypeError, mock)
     137  
     138  
     139      def test_create_autospec_instance(self):
     140          mock = create_autospec(SomeClass, instance=True)
     141  
     142          self.assertRaises(TypeError, mock)
     143          mock.wibble()
     144          mock.wibble.assert_called_once_with()
     145  
     146          self.assertRaises(TypeError, mock.wibble, 'some',  'args')
     147  
     148  
     149  if __name__ == "__main__":
     150      unittest.main()