mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1258 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1258 lines
		
	
	
	
		
			39 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import copy
 | 
						|
import sys
 | 
						|
 | 
						|
import unittest
 | 
						|
from unittest.test.testmock.support import is_instance
 | 
						|
from unittest import mock
 | 
						|
from unittest.mock import (
 | 
						|
    call, DEFAULT, patch, sentinel,
 | 
						|
    MagicMock, Mock, NonCallableMock,
 | 
						|
    NonCallableMagicMock, _CallList,
 | 
						|
    create_autospec
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
class Iter(object):
 | 
						|
    def __init__(self):
 | 
						|
        self.thing = iter(['this', 'is', 'an', 'iter'])
 | 
						|
 | 
						|
    def __iter__(self):
 | 
						|
        return self
 | 
						|
 | 
						|
    def next(self):
 | 
						|
        return next(self.thing)
 | 
						|
 | 
						|
    __next__ = next
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class MockTest(unittest.TestCase):
 | 
						|
 | 
						|
    def test_all(self):
 | 
						|
        # if __all__ is badly defined then import * will raise an error
 | 
						|
        # We have to exec it because you can't import * inside a method
 | 
						|
        # in Python 3
 | 
						|
        exec("from unittest.mock import *")
 | 
						|
 | 
						|
 | 
						|
    def test_constructor(self):
 | 
						|
        mock = Mock()
 | 
						|
 | 
						|
        self.assertFalse(mock.called, "called not initialised correctly")
 | 
						|
        self.assertEqual(mock.call_count, 0,
 | 
						|
                         "call_count not initialised correctly")
 | 
						|
        self.assertTrue(is_instance(mock.return_value, Mock),
 | 
						|
                        "return_value not initialised correctly")
 | 
						|
 | 
						|
        self.assertEqual(mock.call_args, None,
 | 
						|
                         "call_args not initialised correctly")
 | 
						|
        self.assertEqual(mock.call_args_list, [],
 | 
						|
                         "call_args_list not initialised correctly")
 | 
						|
        self.assertEqual(mock.method_calls, [],
 | 
						|
                          "method_calls not initialised correctly")
 | 
						|
 | 
						|
        # Can't use hasattr for this test as it always returns True on a mock
 | 
						|
        self.assertFalse('_items' in mock.__dict__,
 | 
						|
                         "default mock should not have '_items' attribute")
 | 
						|
 | 
						|
        self.assertIsNone(mock._mock_parent,
 | 
						|
                          "parent not initialised correctly")
 | 
						|
        self.assertIsNone(mock._mock_methods,
 | 
						|
                          "methods not initialised correctly")
 | 
						|
        self.assertEqual(mock._mock_children, {},
 | 
						|
                         "children not initialised incorrectly")
 | 
						|
 | 
						|
 | 
						|
    def test_return_value_in_constructor(self):
 | 
						|
        mock = Mock(return_value=None)
 | 
						|
        self.assertIsNone(mock.return_value,
 | 
						|
                          "return value in constructor not honoured")
 | 
						|
 | 
						|
 | 
						|
    def test_repr(self):
 | 
						|
        mock = Mock(name='foo')
 | 
						|
        self.assertIn('foo', repr(mock))
 | 
						|
        self.assertIn("'%s'" % id(mock), repr(mock))
 | 
						|
 | 
						|
        mocks = [(Mock(), 'mock'), (Mock(name='bar'), 'bar')]
 | 
						|
        for mock, name in mocks:
 | 
						|
            self.assertIn('%s.bar' % name, repr(mock.bar))
 | 
						|
            self.assertIn('%s.foo()' % name, repr(mock.foo()))
 | 
						|
            self.assertIn('%s.foo().bing' % name, repr(mock.foo().bing))
 | 
						|
            self.assertIn('%s()' % name, repr(mock()))
 | 
						|
            self.assertIn('%s()()' % name, repr(mock()()))
 | 
						|
            self.assertIn('%s()().foo.bar.baz().bing' % name,
 | 
						|
                          repr(mock()().foo.bar.baz().bing))
 | 
						|
 | 
						|
 | 
						|
    def test_repr_with_spec(self):
 | 
						|
        class X(object):
 | 
						|
            pass
 | 
						|
 | 
						|
        mock = Mock(spec=X)
 | 
						|
        self.assertIn(" spec='X' ", repr(mock))
 | 
						|
 | 
						|
        mock = Mock(spec=X())
 | 
						|
        self.assertIn(" spec='X' ", repr(mock))
 | 
						|
 | 
						|
        mock = Mock(spec_set=X)
 | 
						|
        self.assertIn(" spec_set='X' ", repr(mock))
 | 
						|
 | 
						|
        mock = Mock(spec_set=X())
 | 
						|
        self.assertIn(" spec_set='X' ", repr(mock))
 | 
						|
 | 
						|
        mock = Mock(spec=X, name='foo')
 | 
						|
        self.assertIn(" spec='X' ", repr(mock))
 | 
						|
        self.assertIn(" name='foo' ", repr(mock))
 | 
						|
 | 
						|
        mock = Mock(name='foo')
 | 
						|
        self.assertNotIn("spec", repr(mock))
 | 
						|
 | 
						|
        mock = Mock()
 | 
						|
        self.assertNotIn("spec", repr(mock))
 | 
						|
 | 
						|
        mock = Mock(spec=['foo'])
 | 
						|
        self.assertNotIn("spec", repr(mock))
 | 
						|
 | 
						|
 | 
						|
    def test_side_effect(self):
 | 
						|
        mock = Mock()
 | 
						|
 | 
						|
        def effect(*args, **kwargs):
 | 
						|
            raise SystemError('kablooie')
 | 
						|
 | 
						|
        mock.side_effect = effect
 | 
						|
        self.assertRaises(SystemError, mock, 1, 2, fish=3)
 | 
						|
        mock.assert_called_with(1, 2, fish=3)
 | 
						|
 | 
						|
        results = [1, 2, 3]
 | 
						|
        def effect():
 | 
						|
            return results.pop()
 | 
						|
        mock.side_effect = effect
 | 
						|
 | 
						|
        self.assertEqual([mock(), mock(), mock()], [3, 2, 1],
 | 
						|
                          "side effect not used correctly")
 | 
						|
 | 
						|
        mock = Mock(side_effect=sentinel.SideEffect)
 | 
						|
        self.assertEqual(mock.side_effect, sentinel.SideEffect,
 | 
						|
                          "side effect in constructor not used")
 | 
						|
 | 
						|
        def side_effect():
 | 
						|
            return DEFAULT
 | 
						|
        mock = Mock(side_effect=side_effect, return_value=sentinel.RETURN)
 | 
						|
        self.assertEqual(mock(), sentinel.RETURN)
 | 
						|
 | 
						|
 | 
						|
    @unittest.skipUnless('java' in sys.platform,
 | 
						|
                          'This test only applies to Jython')
 | 
						|
    def test_java_exception_side_effect(self):
 | 
						|
        import java
 | 
						|
        mock = Mock(side_effect=java.lang.RuntimeException("Boom!"))
 | 
						|
 | 
						|
        # can't use assertRaises with java exceptions
 | 
						|
        try:
 | 
						|
            mock(1, 2, fish=3)
 | 
						|
        except java.lang.RuntimeException:
 | 
						|
            pass
 | 
						|
        else:
 | 
						|
            self.fail('java exception not raised')
 | 
						|
        mock.assert_called_with(1,2, fish=3)
 | 
						|
 | 
						|
 | 
						|
    def test_reset_mock(self):
 | 
						|
        parent = Mock()
 | 
						|
        spec = ["something"]
 | 
						|
        mock = Mock(name="child", parent=parent, spec=spec)
 | 
						|
        mock(sentinel.Something, something=sentinel.SomethingElse)
 | 
						|
        something = mock.something
 | 
						|
        mock.something()
 | 
						|
        mock.side_effect = sentinel.SideEffect
 | 
						|
        return_value = mock.return_value
 | 
						|
        return_value()
 | 
						|
 | 
						|
        mock.reset_mock()
 | 
						|
 | 
						|
        self.assertEqual(mock._mock_name, "child",
 | 
						|
                         "name incorrectly reset")
 | 
						|
        self.assertEqual(mock._mock_parent, parent,
 | 
						|
                         "parent incorrectly reset")
 | 
						|
        self.assertEqual(mock._mock_methods, spec,
 | 
						|
                         "methods incorrectly reset")
 | 
						|
 | 
						|
        self.assertFalse(mock.called, "called not reset")
 | 
						|
        self.assertEqual(mock.call_count, 0, "call_count not reset")
 | 
						|
        self.assertEqual(mock.call_args, None, "call_args not reset")
 | 
						|
        self.assertEqual(mock.call_args_list, [], "call_args_list not reset")
 | 
						|
        self.assertEqual(mock.method_calls, [],
 | 
						|
                        "method_calls not initialised correctly: %r != %r" %
 | 
						|
                        (mock.method_calls, []))
 | 
						|
        self.assertEqual(mock.mock_calls, [])
 | 
						|
 | 
						|
        self.assertEqual(mock.side_effect, sentinel.SideEffect,
 | 
						|
                          "side_effect incorrectly reset")
 | 
						|
        self.assertEqual(mock.return_value, return_value,
 | 
						|
                          "return_value incorrectly reset")
 | 
						|
        self.assertFalse(return_value.called, "return value mock not reset")
 | 
						|
        self.assertEqual(mock._mock_children, {'something': something},
 | 
						|
                          "children reset incorrectly")
 | 
						|
        self.assertEqual(mock.something, something,
 | 
						|
                          "children incorrectly cleared")
 | 
						|
        self.assertFalse(mock.something.called, "child not reset")
 | 
						|
 | 
						|
 | 
						|
    def test_reset_mock_recursion(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock.return_value = mock
 | 
						|
 | 
						|
        # used to cause recursion
 | 
						|
        mock.reset_mock()
 | 
						|
 | 
						|
 | 
						|
    def test_call(self):
 | 
						|
        mock = Mock()
 | 
						|
        self.assertTrue(is_instance(mock.return_value, Mock),
 | 
						|
                        "Default return_value should be a Mock")
 | 
						|
 | 
						|
        result = mock()
 | 
						|
        self.assertEqual(mock(), result,
 | 
						|
                         "different result from consecutive calls")
 | 
						|
        mock.reset_mock()
 | 
						|
 | 
						|
        ret_val = mock(sentinel.Arg)
 | 
						|
        self.assertTrue(mock.called, "called not set")
 | 
						|
        self.assertEqual(mock.call_count, 1, "call_count incoreect")
 | 
						|
        self.assertEqual(mock.call_args, ((sentinel.Arg,), {}),
 | 
						|
                         "call_args not set")
 | 
						|
        self.assertEqual(mock.call_args_list, [((sentinel.Arg,), {})],
 | 
						|
                         "call_args_list not initialised correctly")
 | 
						|
 | 
						|
        mock.return_value = sentinel.ReturnValue
 | 
						|
        ret_val = mock(sentinel.Arg, key=sentinel.KeyArg)
 | 
						|
        self.assertEqual(ret_val, sentinel.ReturnValue,
 | 
						|
                         "incorrect return value")
 | 
						|
 | 
						|
        self.assertEqual(mock.call_count, 2, "call_count incorrect")
 | 
						|
        self.assertEqual(mock.call_args,
 | 
						|
                         ((sentinel.Arg,), {'key': sentinel.KeyArg}),
 | 
						|
                         "call_args not set")
 | 
						|
        self.assertEqual(mock.call_args_list, [
 | 
						|
            ((sentinel.Arg,), {}),
 | 
						|
            ((sentinel.Arg,), {'key': sentinel.KeyArg})
 | 
						|
        ],
 | 
						|
            "call_args_list not set")
 | 
						|
 | 
						|
 | 
						|
    def test_call_args_comparison(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock()
 | 
						|
        mock(sentinel.Arg)
 | 
						|
        mock(kw=sentinel.Kwarg)
 | 
						|
        mock(sentinel.Arg, kw=sentinel.Kwarg)
 | 
						|
        self.assertEqual(mock.call_args_list, [
 | 
						|
            (),
 | 
						|
            ((sentinel.Arg,),),
 | 
						|
            ({"kw": sentinel.Kwarg},),
 | 
						|
            ((sentinel.Arg,), {"kw": sentinel.Kwarg})
 | 
						|
        ])
 | 
						|
        self.assertEqual(mock.call_args,
 | 
						|
                         ((sentinel.Arg,), {"kw": sentinel.Kwarg}))
 | 
						|
 | 
						|
 | 
						|
    def test_assert_called_with(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock()
 | 
						|
 | 
						|
        # Will raise an exception if it fails
 | 
						|
        mock.assert_called_with()
 | 
						|
        self.assertRaises(AssertionError, mock.assert_called_with, 1)
 | 
						|
 | 
						|
        mock.reset_mock()
 | 
						|
        self.assertRaises(AssertionError, mock.assert_called_with)
 | 
						|
 | 
						|
        mock(1, 2, 3, a='fish', b='nothing')
 | 
						|
        mock.assert_called_with(1, 2, 3, a='fish', b='nothing')
 | 
						|
 | 
						|
 | 
						|
    def test_assert_called_once_with(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock()
 | 
						|
 | 
						|
        # Will raise an exception if it fails
 | 
						|
        mock.assert_called_once_with()
 | 
						|
 | 
						|
        mock()
 | 
						|
        self.assertRaises(AssertionError, mock.assert_called_once_with)
 | 
						|
 | 
						|
        mock.reset_mock()
 | 
						|
        self.assertRaises(AssertionError, mock.assert_called_once_with)
 | 
						|
 | 
						|
        mock('foo', 'bar', baz=2)
 | 
						|
        mock.assert_called_once_with('foo', 'bar', baz=2)
 | 
						|
 | 
						|
        mock.reset_mock()
 | 
						|
        mock('foo', 'bar', baz=2)
 | 
						|
        self.assertRaises(
 | 
						|
            AssertionError,
 | 
						|
            lambda: mock.assert_called_once_with('bob', 'bar', baz=2)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
    def test_attribute_access_returns_mocks(self):
 | 
						|
        mock = Mock()
 | 
						|
        something = mock.something
 | 
						|
        self.assertTrue(is_instance(something, Mock), "attribute isn't a mock")
 | 
						|
        self.assertEqual(mock.something, something,
 | 
						|
                         "different attributes returned for same name")
 | 
						|
 | 
						|
        # Usage example
 | 
						|
        mock = Mock()
 | 
						|
        mock.something.return_value = 3
 | 
						|
 | 
						|
        self.assertEqual(mock.something(), 3, "method returned wrong value")
 | 
						|
        self.assertTrue(mock.something.called,
 | 
						|
                        "method didn't record being called")
 | 
						|
 | 
						|
 | 
						|
    def test_attributes_have_name_and_parent_set(self):
 | 
						|
        mock = Mock()
 | 
						|
        something = mock.something
 | 
						|
 | 
						|
        self.assertEqual(something._mock_name, "something",
 | 
						|
                         "attribute name not set correctly")
 | 
						|
        self.assertEqual(something._mock_parent, mock,
 | 
						|
                         "attribute parent not set correctly")
 | 
						|
 | 
						|
 | 
						|
    def test_method_calls_recorded(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock.something(3, fish=None)
 | 
						|
        mock.something_else.something(6, cake=sentinel.Cake)
 | 
						|
 | 
						|
        self.assertEqual(mock.something_else.method_calls,
 | 
						|
                          [("something", (6,), {'cake': sentinel.Cake})],
 | 
						|
                          "method calls not recorded correctly")
 | 
						|
        self.assertEqual(mock.method_calls, [
 | 
						|
            ("something", (3,), {'fish': None}),
 | 
						|
            ("something_else.something", (6,), {'cake': sentinel.Cake})
 | 
						|
        ],
 | 
						|
            "method calls not recorded correctly")
 | 
						|
 | 
						|
 | 
						|
    def test_method_calls_compare_easily(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock.something()
 | 
						|
        self.assertEqual(mock.method_calls, [('something',)])
 | 
						|
        self.assertEqual(mock.method_calls, [('something', (), {})])
 | 
						|
 | 
						|
        mock = Mock()
 | 
						|
        mock.something('different')
 | 
						|
        self.assertEqual(mock.method_calls, [('something', ('different',))])
 | 
						|
        self.assertEqual(mock.method_calls,
 | 
						|
                         [('something', ('different',), {})])
 | 
						|
 | 
						|
        mock = Mock()
 | 
						|
        mock.something(x=1)
 | 
						|
        self.assertEqual(mock.method_calls, [('something', {'x': 1})])
 | 
						|
        self.assertEqual(mock.method_calls, [('something', (), {'x': 1})])
 | 
						|
 | 
						|
        mock = Mock()
 | 
						|
        mock.something('different', some='more')
 | 
						|
        self.assertEqual(mock.method_calls, [
 | 
						|
            ('something', ('different',), {'some': 'more'})
 | 
						|
        ])
 | 
						|
 | 
						|
 | 
						|
    def test_only_allowed_methods_exist(self):
 | 
						|
        for spec in ['something'], ('something',):
 | 
						|
            for arg in 'spec', 'spec_set':
 | 
						|
                mock = Mock(**{arg: spec})
 | 
						|
 | 
						|
                # this should be allowed
 | 
						|
                mock.something
 | 
						|
                self.assertRaisesRegex(
 | 
						|
                    AttributeError,
 | 
						|
                    "Mock object has no attribute 'something_else'",
 | 
						|
                    getattr, mock, 'something_else'
 | 
						|
                )
 | 
						|
 | 
						|
 | 
						|
    def test_from_spec(self):
 | 
						|
        class Something(object):
 | 
						|
            x = 3
 | 
						|
            __something__ = None
 | 
						|
            def y(self):
 | 
						|
                pass
 | 
						|
 | 
						|
        def test_attributes(mock):
 | 
						|
            # should work
 | 
						|
            mock.x
 | 
						|
            mock.y
 | 
						|
            mock.__something__
 | 
						|
            self.assertRaisesRegex(
 | 
						|
                AttributeError,
 | 
						|
                "Mock object has no attribute 'z'",
 | 
						|
                getattr, mock, 'z'
 | 
						|
            )
 | 
						|
            self.assertRaisesRegex(
 | 
						|
                AttributeError,
 | 
						|
                "Mock object has no attribute '__foobar__'",
 | 
						|
                getattr, mock, '__foobar__'
 | 
						|
            )
 | 
						|
 | 
						|
        test_attributes(Mock(spec=Something))
 | 
						|
        test_attributes(Mock(spec=Something()))
 | 
						|
 | 
						|
 | 
						|
    def test_wraps_calls(self):
 | 
						|
        real = Mock()
 | 
						|
 | 
						|
        mock = Mock(wraps=real)
 | 
						|
        self.assertEqual(mock(), real())
 | 
						|
 | 
						|
        real.reset_mock()
 | 
						|
 | 
						|
        mock(1, 2, fish=3)
 | 
						|
        real.assert_called_with(1, 2, fish=3)
 | 
						|
 | 
						|
 | 
						|
    def test_wraps_call_with_nondefault_return_value(self):
 | 
						|
        real = Mock()
 | 
						|
 | 
						|
        mock = Mock(wraps=real)
 | 
						|
        mock.return_value = 3
 | 
						|
 | 
						|
        self.assertEqual(mock(), 3)
 | 
						|
        self.assertFalse(real.called)
 | 
						|
 | 
						|
 | 
						|
    def test_wraps_attributes(self):
 | 
						|
        class Real(object):
 | 
						|
            attribute = Mock()
 | 
						|
 | 
						|
        real = Real()
 | 
						|
 | 
						|
        mock = Mock(wraps=real)
 | 
						|
        self.assertEqual(mock.attribute(), real.attribute())
 | 
						|
        self.assertRaises(AttributeError, lambda: mock.fish)
 | 
						|
 | 
						|
        self.assertNotEqual(mock.attribute, real.attribute)
 | 
						|
        result = mock.attribute.frog(1, 2, fish=3)
 | 
						|
        Real.attribute.frog.assert_called_with(1, 2, fish=3)
 | 
						|
        self.assertEqual(result, Real.attribute.frog())
 | 
						|
 | 
						|
 | 
						|
    def test_exceptional_side_effect(self):
 | 
						|
        mock = Mock(side_effect=AttributeError)
 | 
						|
        self.assertRaises(AttributeError, mock)
 | 
						|
 | 
						|
        mock = Mock(side_effect=AttributeError('foo'))
 | 
						|
        self.assertRaises(AttributeError, mock)
 | 
						|
 | 
						|
 | 
						|
    def test_baseexceptional_side_effect(self):
 | 
						|
        mock = Mock(side_effect=KeyboardInterrupt)
 | 
						|
        self.assertRaises(KeyboardInterrupt, mock)
 | 
						|
 | 
						|
        mock = Mock(side_effect=KeyboardInterrupt('foo'))
 | 
						|
        self.assertRaises(KeyboardInterrupt, mock)
 | 
						|
 | 
						|
 | 
						|
    def test_assert_called_with_message(self):
 | 
						|
        mock = Mock()
 | 
						|
        self.assertRaisesRegex(AssertionError, 'Not called',
 | 
						|
                                mock.assert_called_with)
 | 
						|
 | 
						|
 | 
						|
    def test__name__(self):
 | 
						|
        mock = Mock()
 | 
						|
        self.assertRaises(AttributeError, lambda: mock.__name__)
 | 
						|
 | 
						|
        mock.__name__ = 'foo'
 | 
						|
        self.assertEqual(mock.__name__, 'foo')
 | 
						|
 | 
						|
 | 
						|
    def test_spec_list_subclass(self):
 | 
						|
        class Sub(list):
 | 
						|
            pass
 | 
						|
        mock = Mock(spec=Sub(['foo']))
 | 
						|
 | 
						|
        mock.append(3)
 | 
						|
        mock.append.assert_called_with(3)
 | 
						|
        self.assertRaises(AttributeError, getattr, mock, 'foo')
 | 
						|
 | 
						|
 | 
						|
    def test_spec_class(self):
 | 
						|
        class X(object):
 | 
						|
            pass
 | 
						|
 | 
						|
        mock = Mock(spec=X)
 | 
						|
        self.assertTrue(isinstance(mock, X))
 | 
						|
 | 
						|
        mock = Mock(spec=X())
 | 
						|
        self.assertTrue(isinstance(mock, X))
 | 
						|
 | 
						|
        self.assertIs(mock.__class__, X)
 | 
						|
        self.assertEqual(Mock().__class__.__name__, 'Mock')
 | 
						|
 | 
						|
        mock = Mock(spec_set=X)
 | 
						|
        self.assertTrue(isinstance(mock, X))
 | 
						|
 | 
						|
        mock = Mock(spec_set=X())
 | 
						|
        self.assertTrue(isinstance(mock, X))
 | 
						|
 | 
						|
 | 
						|
    def test_setting_attribute_with_spec_set(self):
 | 
						|
        class X(object):
 | 
						|
            y = 3
 | 
						|
 | 
						|
        mock = Mock(spec=X)
 | 
						|
        mock.x = 'foo'
 | 
						|
 | 
						|
        mock = Mock(spec_set=X)
 | 
						|
        def set_attr():
 | 
						|
            mock.x = 'foo'
 | 
						|
 | 
						|
        mock.y = 'foo'
 | 
						|
        self.assertRaises(AttributeError, set_attr)
 | 
						|
 | 
						|
 | 
						|
    def test_copy(self):
 | 
						|
        current = sys.getrecursionlimit()
 | 
						|
        self.addCleanup(sys.setrecursionlimit, current)
 | 
						|
 | 
						|
        # can't use sys.maxint as this doesn't exist in Python 3
 | 
						|
        sys.setrecursionlimit(int(10e8))
 | 
						|
        # this segfaults without the fix in place
 | 
						|
        copy.copy(Mock())
 | 
						|
 | 
						|
 | 
						|
    def test_subclass_with_properties(self):
 | 
						|
        class SubClass(Mock):
 | 
						|
            def _get(self):
 | 
						|
                return 3
 | 
						|
            def _set(self, value):
 | 
						|
                raise NameError('strange error')
 | 
						|
            some_attribute = property(_get, _set)
 | 
						|
 | 
						|
        s = SubClass(spec_set=SubClass)
 | 
						|
        self.assertEqual(s.some_attribute, 3)
 | 
						|
 | 
						|
        def test():
 | 
						|
            s.some_attribute = 3
 | 
						|
        self.assertRaises(NameError, test)
 | 
						|
 | 
						|
        def test():
 | 
						|
            s.foo = 'bar'
 | 
						|
        self.assertRaises(AttributeError, test)
 | 
						|
 | 
						|
 | 
						|
    def test_setting_call(self):
 | 
						|
        mock = Mock()
 | 
						|
        def __call__(self, a):
 | 
						|
            return self._mock_call(a)
 | 
						|
 | 
						|
        type(mock).__call__ = __call__
 | 
						|
        mock('one')
 | 
						|
        mock.assert_called_with('one')
 | 
						|
 | 
						|
        self.assertRaises(TypeError, mock, 'one', 'two')
 | 
						|
 | 
						|
 | 
						|
    def test_dir(self):
 | 
						|
        mock = Mock()
 | 
						|
        attrs = set(dir(mock))
 | 
						|
        type_attrs = set([m for m in dir(Mock) if not m.startswith('_')])
 | 
						|
 | 
						|
        # all public attributes from the type are included
 | 
						|
        self.assertEqual(set(), type_attrs - attrs)
 | 
						|
 | 
						|
        # creates these attributes
 | 
						|
        mock.a, mock.b
 | 
						|
        self.assertIn('a', dir(mock))
 | 
						|
        self.assertIn('b', dir(mock))
 | 
						|
 | 
						|
        # instance attributes
 | 
						|
        mock.c = mock.d = None
 | 
						|
        self.assertIn('c', dir(mock))
 | 
						|
        self.assertIn('d', dir(mock))
 | 
						|
 | 
						|
        # magic methods
 | 
						|
        mock.__iter__ = lambda s: iter([])
 | 
						|
        self.assertIn('__iter__', dir(mock))
 | 
						|
 | 
						|
 | 
						|
    def test_dir_from_spec(self):
 | 
						|
        mock = Mock(spec=unittest.TestCase)
 | 
						|
        testcase_attrs = set(dir(unittest.TestCase))
 | 
						|
        attrs = set(dir(mock))
 | 
						|
 | 
						|
        # all attributes from the spec are included
 | 
						|
        self.assertEqual(set(), testcase_attrs - attrs)
 | 
						|
 | 
						|
        # shadow a sys attribute
 | 
						|
        mock.version = 3
 | 
						|
        self.assertEqual(dir(mock).count('version'), 1)
 | 
						|
 | 
						|
 | 
						|
    def test_filter_dir(self):
 | 
						|
        patcher = patch.object(mock, 'FILTER_DIR', False)
 | 
						|
        patcher.start()
 | 
						|
        try:
 | 
						|
            attrs = set(dir(Mock()))
 | 
						|
            type_attrs = set(dir(Mock))
 | 
						|
 | 
						|
            # ALL attributes from the type are included
 | 
						|
            self.assertEqual(set(), type_attrs - attrs)
 | 
						|
        finally:
 | 
						|
            patcher.stop()
 | 
						|
 | 
						|
 | 
						|
    def test_configure_mock(self):
 | 
						|
        mock = Mock(foo='bar')
 | 
						|
        self.assertEqual(mock.foo, 'bar')
 | 
						|
 | 
						|
        mock = MagicMock(foo='bar')
 | 
						|
        self.assertEqual(mock.foo, 'bar')
 | 
						|
 | 
						|
        kwargs = {'side_effect': KeyError, 'foo.bar.return_value': 33,
 | 
						|
                  'foo': MagicMock()}
 | 
						|
        mock = Mock(**kwargs)
 | 
						|
        self.assertRaises(KeyError, mock)
 | 
						|
        self.assertEqual(mock.foo.bar(), 33)
 | 
						|
        self.assertIsInstance(mock.foo, MagicMock)
 | 
						|
 | 
						|
        mock = Mock()
 | 
						|
        mock.configure_mock(**kwargs)
 | 
						|
        self.assertRaises(KeyError, mock)
 | 
						|
        self.assertEqual(mock.foo.bar(), 33)
 | 
						|
        self.assertIsInstance(mock.foo, MagicMock)
 | 
						|
 | 
						|
 | 
						|
    def assertRaisesWithMsg(self, exception, message, func, *args, **kwargs):
 | 
						|
        # needed because assertRaisesRegex doesn't work easily with newlines
 | 
						|
        try:
 | 
						|
            func(*args, **kwargs)
 | 
						|
        except:
 | 
						|
            instance = sys.exc_info()[1]
 | 
						|
            self.assertIsInstance(instance, exception)
 | 
						|
        else:
 | 
						|
            self.fail('Exception %r not raised' % (exception,))
 | 
						|
 | 
						|
        msg = str(instance)
 | 
						|
        self.assertEqual(msg, message)
 | 
						|
 | 
						|
 | 
						|
    def test_assert_called_with_failure_message(self):
 | 
						|
        mock = NonCallableMock()
 | 
						|
 | 
						|
        expected = "mock(1, '2', 3, bar='foo')"
 | 
						|
        message = 'Expected call: %s\nNot called'
 | 
						|
        self.assertRaisesWithMsg(
 | 
						|
            AssertionError, message % (expected,),
 | 
						|
            mock.assert_called_with, 1, '2', 3, bar='foo'
 | 
						|
        )
 | 
						|
 | 
						|
        mock.foo(1, '2', 3, foo='foo')
 | 
						|
 | 
						|
 | 
						|
        asserters = [
 | 
						|
            mock.foo.assert_called_with, mock.foo.assert_called_once_with
 | 
						|
        ]
 | 
						|
        for meth in asserters:
 | 
						|
            actual = "foo(1, '2', 3, foo='foo')"
 | 
						|
            expected = "foo(1, '2', 3, bar='foo')"
 | 
						|
            message = 'Expected call: %s\nActual call: %s'
 | 
						|
            self.assertRaisesWithMsg(
 | 
						|
                AssertionError, message % (expected, actual),
 | 
						|
                meth, 1, '2', 3, bar='foo'
 | 
						|
            )
 | 
						|
 | 
						|
        # just kwargs
 | 
						|
        for meth in asserters:
 | 
						|
            actual = "foo(1, '2', 3, foo='foo')"
 | 
						|
            expected = "foo(bar='foo')"
 | 
						|
            message = 'Expected call: %s\nActual call: %s'
 | 
						|
            self.assertRaisesWithMsg(
 | 
						|
                AssertionError, message % (expected, actual),
 | 
						|
                meth, bar='foo'
 | 
						|
            )
 | 
						|
 | 
						|
        # just args
 | 
						|
        for meth in asserters:
 | 
						|
            actual = "foo(1, '2', 3, foo='foo')"
 | 
						|
            expected = "foo(1, 2, 3)"
 | 
						|
            message = 'Expected call: %s\nActual call: %s'
 | 
						|
            self.assertRaisesWithMsg(
 | 
						|
                AssertionError, message % (expected, actual),
 | 
						|
                meth, 1, 2, 3
 | 
						|
            )
 | 
						|
 | 
						|
        # empty
 | 
						|
        for meth in asserters:
 | 
						|
            actual = "foo(1, '2', 3, foo='foo')"
 | 
						|
            expected = "foo()"
 | 
						|
            message = 'Expected call: %s\nActual call: %s'
 | 
						|
            self.assertRaisesWithMsg(
 | 
						|
                AssertionError, message % (expected, actual), meth
 | 
						|
            )
 | 
						|
 | 
						|
 | 
						|
    def test_mock_calls(self):
 | 
						|
        mock = MagicMock()
 | 
						|
 | 
						|
        # need to do this because MagicMock.mock_calls used to just return
 | 
						|
        # a MagicMock which also returned a MagicMock when __eq__ was called
 | 
						|
        self.assertIs(mock.mock_calls == [], True)
 | 
						|
 | 
						|
        mock = MagicMock()
 | 
						|
        mock()
 | 
						|
        expected = [('', (), {})]
 | 
						|
        self.assertEqual(mock.mock_calls, expected)
 | 
						|
 | 
						|
        mock.foo()
 | 
						|
        expected.append(call.foo())
 | 
						|
        self.assertEqual(mock.mock_calls, expected)
 | 
						|
        # intermediate mock_calls work too
 | 
						|
        self.assertEqual(mock.foo.mock_calls, [('', (), {})])
 | 
						|
 | 
						|
        mock = MagicMock()
 | 
						|
        mock().foo(1, 2, 3, a=4, b=5)
 | 
						|
        expected = [
 | 
						|
            ('', (), {}), ('().foo', (1, 2, 3), dict(a=4, b=5))
 | 
						|
        ]
 | 
						|
        self.assertEqual(mock.mock_calls, expected)
 | 
						|
        self.assertEqual(mock.return_value.foo.mock_calls,
 | 
						|
                         [('', (1, 2, 3), dict(a=4, b=5))])
 | 
						|
        self.assertEqual(mock.return_value.mock_calls,
 | 
						|
                         [('foo', (1, 2, 3), dict(a=4, b=5))])
 | 
						|
 | 
						|
        mock = MagicMock()
 | 
						|
        mock().foo.bar().baz()
 | 
						|
        expected = [
 | 
						|
            ('', (), {}), ('().foo.bar', (), {}),
 | 
						|
            ('().foo.bar().baz', (), {})
 | 
						|
        ]
 | 
						|
        self.assertEqual(mock.mock_calls, expected)
 | 
						|
        self.assertEqual(mock().mock_calls,
 | 
						|
                         call.foo.bar().baz().call_list())
 | 
						|
 | 
						|
        for kwargs in dict(), dict(name='bar'):
 | 
						|
            mock = MagicMock(**kwargs)
 | 
						|
            int(mock.foo)
 | 
						|
            expected = [('foo.__int__', (), {})]
 | 
						|
            self.assertEqual(mock.mock_calls, expected)
 | 
						|
 | 
						|
            mock = MagicMock(**kwargs)
 | 
						|
            mock.a()()
 | 
						|
            expected = [('a', (), {}), ('a()', (), {})]
 | 
						|
            self.assertEqual(mock.mock_calls, expected)
 | 
						|
            self.assertEqual(mock.a().mock_calls, [call()])
 | 
						|
 | 
						|
            mock = MagicMock(**kwargs)
 | 
						|
            mock(1)(2)(3)
 | 
						|
            self.assertEqual(mock.mock_calls, call(1)(2)(3).call_list())
 | 
						|
            self.assertEqual(mock().mock_calls, call(2)(3).call_list())
 | 
						|
            self.assertEqual(mock()().mock_calls, call(3).call_list())
 | 
						|
 | 
						|
            mock = MagicMock(**kwargs)
 | 
						|
            mock(1)(2)(3).a.b.c(4)
 | 
						|
            self.assertEqual(mock.mock_calls,
 | 
						|
                             call(1)(2)(3).a.b.c(4).call_list())
 | 
						|
            self.assertEqual(mock().mock_calls,
 | 
						|
                             call(2)(3).a.b.c(4).call_list())
 | 
						|
            self.assertEqual(mock()().mock_calls,
 | 
						|
                             call(3).a.b.c(4).call_list())
 | 
						|
 | 
						|
            mock = MagicMock(**kwargs)
 | 
						|
            int(mock().foo.bar().baz())
 | 
						|
            last_call = ('().foo.bar().baz().__int__', (), {})
 | 
						|
            self.assertEqual(mock.mock_calls[-1], last_call)
 | 
						|
            self.assertEqual(mock().mock_calls,
 | 
						|
                             call.foo.bar().baz().__int__().call_list())
 | 
						|
            self.assertEqual(mock().foo.bar().mock_calls,
 | 
						|
                             call.baz().__int__().call_list())
 | 
						|
            self.assertEqual(mock().foo.bar().baz.mock_calls,
 | 
						|
                             call().__int__().call_list())
 | 
						|
 | 
						|
 | 
						|
    def test_subclassing(self):
 | 
						|
        class Subclass(Mock):
 | 
						|
            pass
 | 
						|
 | 
						|
        mock = Subclass()
 | 
						|
        self.assertIsInstance(mock.foo, Subclass)
 | 
						|
        self.assertIsInstance(mock(), Subclass)
 | 
						|
 | 
						|
        class Subclass(Mock):
 | 
						|
            def _get_child_mock(self, **kwargs):
 | 
						|
                return Mock(**kwargs)
 | 
						|
 | 
						|
        mock = Subclass()
 | 
						|
        self.assertNotIsInstance(mock.foo, Subclass)
 | 
						|
        self.assertNotIsInstance(mock(), Subclass)
 | 
						|
 | 
						|
 | 
						|
    def test_arg_lists(self):
 | 
						|
        mocks = [
 | 
						|
            Mock(),
 | 
						|
            MagicMock(),
 | 
						|
            NonCallableMock(),
 | 
						|
            NonCallableMagicMock()
 | 
						|
        ]
 | 
						|
 | 
						|
        def assert_attrs(mock):
 | 
						|
            names = 'call_args_list', 'method_calls', 'mock_calls'
 | 
						|
            for name in names:
 | 
						|
                attr = getattr(mock, name)
 | 
						|
                self.assertIsInstance(attr, _CallList)
 | 
						|
                self.assertIsInstance(attr, list)
 | 
						|
                self.assertEqual(attr, [])
 | 
						|
 | 
						|
        for mock in mocks:
 | 
						|
            assert_attrs(mock)
 | 
						|
 | 
						|
            if callable(mock):
 | 
						|
                mock()
 | 
						|
                mock(1, 2)
 | 
						|
                mock(a=3)
 | 
						|
 | 
						|
                mock.reset_mock()
 | 
						|
                assert_attrs(mock)
 | 
						|
 | 
						|
            mock.foo()
 | 
						|
            mock.foo.bar(1, a=3)
 | 
						|
            mock.foo(1).bar().baz(3)
 | 
						|
 | 
						|
            mock.reset_mock()
 | 
						|
            assert_attrs(mock)
 | 
						|
 | 
						|
 | 
						|
    def test_call_args_two_tuple(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock(1, a=3)
 | 
						|
        mock(2, b=4)
 | 
						|
 | 
						|
        self.assertEqual(len(mock.call_args), 2)
 | 
						|
        args, kwargs = mock.call_args
 | 
						|
        self.assertEqual(args, (2,))
 | 
						|
        self.assertEqual(kwargs, dict(b=4))
 | 
						|
 | 
						|
        expected_list = [((1,), dict(a=3)), ((2,), dict(b=4))]
 | 
						|
        for expected, call_args in zip(expected_list, mock.call_args_list):
 | 
						|
            self.assertEqual(len(call_args), 2)
 | 
						|
            self.assertEqual(expected[0], call_args[0])
 | 
						|
            self.assertEqual(expected[1], call_args[1])
 | 
						|
 | 
						|
 | 
						|
    def test_side_effect_iterator(self):
 | 
						|
        mock = Mock(side_effect=iter([1, 2, 3]))
 | 
						|
        self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
 | 
						|
        self.assertRaises(StopIteration, mock)
 | 
						|
 | 
						|
        mock = MagicMock(side_effect=['a', 'b', 'c'])
 | 
						|
        self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
 | 
						|
        self.assertRaises(StopIteration, mock)
 | 
						|
 | 
						|
        mock = Mock(side_effect='ghi')
 | 
						|
        self.assertEqual([mock(), mock(), mock()], ['g', 'h', 'i'])
 | 
						|
        self.assertRaises(StopIteration, mock)
 | 
						|
 | 
						|
        class Foo(object):
 | 
						|
            pass
 | 
						|
        mock = MagicMock(side_effect=Foo)
 | 
						|
        self.assertIsInstance(mock(), Foo)
 | 
						|
 | 
						|
        mock = Mock(side_effect=Iter())
 | 
						|
        self.assertEqual([mock(), mock(), mock(), mock()],
 | 
						|
                         ['this', 'is', 'an', 'iter'])
 | 
						|
        self.assertRaises(StopIteration, mock)
 | 
						|
 | 
						|
 | 
						|
    def test_side_effect_setting_iterator(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock.side_effect = iter([1, 2, 3])
 | 
						|
        self.assertEqual([mock(), mock(), mock()], [1, 2, 3])
 | 
						|
        self.assertRaises(StopIteration, mock)
 | 
						|
        side_effect = mock.side_effect
 | 
						|
        self.assertIsInstance(side_effect, type(iter([])))
 | 
						|
 | 
						|
        mock.side_effect = ['a', 'b', 'c']
 | 
						|
        self.assertEqual([mock(), mock(), mock()], ['a', 'b', 'c'])
 | 
						|
        self.assertRaises(StopIteration, mock)
 | 
						|
        side_effect = mock.side_effect
 | 
						|
        self.assertIsInstance(side_effect, type(iter([])))
 | 
						|
 | 
						|
        this_iter = Iter()
 | 
						|
        mock.side_effect = this_iter
 | 
						|
        self.assertEqual([mock(), mock(), mock(), mock()],
 | 
						|
                         ['this', 'is', 'an', 'iter'])
 | 
						|
        self.assertRaises(StopIteration, mock)
 | 
						|
        self.assertIs(mock.side_effect, this_iter)
 | 
						|
 | 
						|
 | 
						|
    def test_assert_has_calls_any_order(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock(1, 2)
 | 
						|
        mock(a=3)
 | 
						|
        mock(3, 4)
 | 
						|
        mock(b=6)
 | 
						|
        mock(b=6)
 | 
						|
 | 
						|
        kalls = [
 | 
						|
            call(1, 2), ({'a': 3},),
 | 
						|
            ((3, 4),), ((), {'a': 3}),
 | 
						|
            ('', (1, 2)), ('', {'a': 3}),
 | 
						|
            ('', (1, 2), {}), ('', (), {'a': 3})
 | 
						|
        ]
 | 
						|
        for kall in kalls:
 | 
						|
            mock.assert_has_calls([kall], any_order=True)
 | 
						|
 | 
						|
        for kall in call(1, '2'), call(b=3), call(), 3, None, 'foo':
 | 
						|
            self.assertRaises(
 | 
						|
                AssertionError, mock.assert_has_calls,
 | 
						|
                [kall], any_order=True
 | 
						|
            )
 | 
						|
 | 
						|
        kall_lists = [
 | 
						|
            [call(1, 2), call(b=6)],
 | 
						|
            [call(3, 4), call(1, 2)],
 | 
						|
            [call(b=6), call(b=6)],
 | 
						|
        ]
 | 
						|
 | 
						|
        for kall_list in kall_lists:
 | 
						|
            mock.assert_has_calls(kall_list, any_order=True)
 | 
						|
 | 
						|
        kall_lists = [
 | 
						|
            [call(b=6), call(b=6), call(b=6)],
 | 
						|
            [call(1, 2), call(1, 2)],
 | 
						|
            [call(3, 4), call(1, 2), call(5, 7)],
 | 
						|
            [call(b=6), call(3, 4), call(b=6), call(1, 2), call(b=6)],
 | 
						|
        ]
 | 
						|
        for kall_list in kall_lists:
 | 
						|
            self.assertRaises(
 | 
						|
                AssertionError, mock.assert_has_calls,
 | 
						|
                kall_list, any_order=True
 | 
						|
            )
 | 
						|
 | 
						|
    def test_assert_has_calls(self):
 | 
						|
        kalls1 = [
 | 
						|
                call(1, 2), ({'a': 3},),
 | 
						|
                ((3, 4),), call(b=6),
 | 
						|
                ('', (1,), {'b': 6}),
 | 
						|
        ]
 | 
						|
        kalls2 = [call.foo(), call.bar(1)]
 | 
						|
        kalls2.extend(call.spam().baz(a=3).call_list())
 | 
						|
        kalls2.extend(call.bam(set(), foo={}).fish([1]).call_list())
 | 
						|
 | 
						|
        mocks = []
 | 
						|
        for mock in Mock(), MagicMock():
 | 
						|
            mock(1, 2)
 | 
						|
            mock(a=3)
 | 
						|
            mock(3, 4)
 | 
						|
            mock(b=6)
 | 
						|
            mock(1, b=6)
 | 
						|
            mocks.append((mock, kalls1))
 | 
						|
 | 
						|
        mock = Mock()
 | 
						|
        mock.foo()
 | 
						|
        mock.bar(1)
 | 
						|
        mock.spam().baz(a=3)
 | 
						|
        mock.bam(set(), foo={}).fish([1])
 | 
						|
        mocks.append((mock, kalls2))
 | 
						|
 | 
						|
        for mock, kalls in mocks:
 | 
						|
            for i in range(len(kalls)):
 | 
						|
                for step in 1, 2, 3:
 | 
						|
                    these = kalls[i:i+step]
 | 
						|
                    mock.assert_has_calls(these)
 | 
						|
 | 
						|
                    if len(these) > 1:
 | 
						|
                        self.assertRaises(
 | 
						|
                            AssertionError,
 | 
						|
                            mock.assert_has_calls,
 | 
						|
                            list(reversed(these))
 | 
						|
                        )
 | 
						|
 | 
						|
 | 
						|
    def test_assert_any_call(self):
 | 
						|
        mock = Mock()
 | 
						|
        mock(1, 2)
 | 
						|
        mock(a=3)
 | 
						|
        mock(1, b=6)
 | 
						|
 | 
						|
        mock.assert_any_call(1, 2)
 | 
						|
        mock.assert_any_call(a=3)
 | 
						|
        mock.assert_any_call(1, b=6)
 | 
						|
 | 
						|
        self.assertRaises(
 | 
						|
            AssertionError,
 | 
						|
            mock.assert_any_call
 | 
						|
        )
 | 
						|
        self.assertRaises(
 | 
						|
            AssertionError,
 | 
						|
            mock.assert_any_call,
 | 
						|
            1, 3
 | 
						|
        )
 | 
						|
        self.assertRaises(
 | 
						|
            AssertionError,
 | 
						|
            mock.assert_any_call,
 | 
						|
            a=4
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
    def test_mock_calls_create_autospec(self):
 | 
						|
        def f(a, b):
 | 
						|
            pass
 | 
						|
        obj = Iter()
 | 
						|
        obj.f = f
 | 
						|
 | 
						|
        funcs = [
 | 
						|
            create_autospec(f),
 | 
						|
            create_autospec(obj).f
 | 
						|
        ]
 | 
						|
        for func in funcs:
 | 
						|
            func(1, 2)
 | 
						|
            func(3, 4)
 | 
						|
 | 
						|
            self.assertEqual(
 | 
						|
                func.mock_calls, [call(1, 2), call(3, 4)]
 | 
						|
            )
 | 
						|
 | 
						|
 | 
						|
    def test_mock_add_spec(self):
 | 
						|
        class _One(object):
 | 
						|
            one = 1
 | 
						|
        class _Two(object):
 | 
						|
            two = 2
 | 
						|
        class Anything(object):
 | 
						|
            one = two = three = 'four'
 | 
						|
 | 
						|
        klasses = [
 | 
						|
            Mock, MagicMock, NonCallableMock, NonCallableMagicMock
 | 
						|
        ]
 | 
						|
        for Klass in list(klasses):
 | 
						|
            klasses.append(lambda K=Klass: K(spec=Anything))
 | 
						|
            klasses.append(lambda K=Klass: K(spec_set=Anything))
 | 
						|
 | 
						|
        for Klass in klasses:
 | 
						|
            for kwargs in dict(), dict(spec_set=True):
 | 
						|
                mock = Klass()
 | 
						|
                #no error
 | 
						|
                mock.one, mock.two, mock.three
 | 
						|
 | 
						|
                for One, Two in [(_One, _Two), (['one'], ['two'])]:
 | 
						|
                    for kwargs in dict(), dict(spec_set=True):
 | 
						|
                        mock.mock_add_spec(One, **kwargs)
 | 
						|
 | 
						|
                        mock.one
 | 
						|
                        self.assertRaises(
 | 
						|
                            AttributeError, getattr, mock, 'two'
 | 
						|
                        )
 | 
						|
                        self.assertRaises(
 | 
						|
                            AttributeError, getattr, mock, 'three'
 | 
						|
                        )
 | 
						|
                        if 'spec_set' in kwargs:
 | 
						|
                            self.assertRaises(
 | 
						|
                                AttributeError, setattr, mock, 'three', None
 | 
						|
                            )
 | 
						|
 | 
						|
                        mock.mock_add_spec(Two, **kwargs)
 | 
						|
                        self.assertRaises(
 | 
						|
                            AttributeError, getattr, mock, 'one'
 | 
						|
                        )
 | 
						|
                        mock.two
 | 
						|
                        self.assertRaises(
 | 
						|
                            AttributeError, getattr, mock, 'three'
 | 
						|
                        )
 | 
						|
                        if 'spec_set' in kwargs:
 | 
						|
                            self.assertRaises(
 | 
						|
                                AttributeError, setattr, mock, 'three', None
 | 
						|
                            )
 | 
						|
            # note that creating a mock, setting an instance attribute, and
 | 
						|
            # *then* setting a spec doesn't work. Not the intended use case
 | 
						|
 | 
						|
 | 
						|
    def test_mock_add_spec_magic_methods(self):
 | 
						|
        for Klass in MagicMock, NonCallableMagicMock:
 | 
						|
            mock = Klass()
 | 
						|
            int(mock)
 | 
						|
 | 
						|
            mock.mock_add_spec(object)
 | 
						|
            self.assertRaises(TypeError, int, mock)
 | 
						|
 | 
						|
            mock = Klass()
 | 
						|
            mock['foo']
 | 
						|
            mock.__int__.return_value =4
 | 
						|
 | 
						|
            mock.mock_add_spec(int)
 | 
						|
            self.assertEqual(int(mock), 4)
 | 
						|
            self.assertRaises(TypeError, lambda: mock['foo'])
 | 
						|
 | 
						|
 | 
						|
    def test_adding_child_mock(self):
 | 
						|
        for Klass in NonCallableMock, Mock, MagicMock, NonCallableMagicMock:
 | 
						|
            mock = Klass()
 | 
						|
 | 
						|
            mock.foo = Mock()
 | 
						|
            mock.foo()
 | 
						|
 | 
						|
            self.assertEqual(mock.method_calls, [call.foo()])
 | 
						|
            self.assertEqual(mock.mock_calls, [call.foo()])
 | 
						|
 | 
						|
            mock = Klass()
 | 
						|
            mock.bar = Mock(name='name')
 | 
						|
            mock.bar()
 | 
						|
            self.assertEqual(mock.method_calls, [])
 | 
						|
            self.assertEqual(mock.mock_calls, [])
 | 
						|
 | 
						|
            # mock with an existing _new_parent but no name
 | 
						|
            mock = Klass()
 | 
						|
            mock.baz = MagicMock()()
 | 
						|
            mock.baz()
 | 
						|
            self.assertEqual(mock.method_calls, [])
 | 
						|
            self.assertEqual(mock.mock_calls, [])
 | 
						|
 | 
						|
 | 
						|
    def test_adding_return_value_mock(self):
 | 
						|
        for Klass in Mock, MagicMock:
 | 
						|
            mock = Klass()
 | 
						|
            mock.return_value = MagicMock()
 | 
						|
 | 
						|
            mock()()
 | 
						|
            self.assertEqual(mock.mock_calls, [call(), call()()])
 | 
						|
 | 
						|
 | 
						|
    def test_manager_mock(self):
 | 
						|
        class Foo(object):
 | 
						|
            one = 'one'
 | 
						|
            two = 'two'
 | 
						|
        manager = Mock()
 | 
						|
        p1 = patch.object(Foo, 'one')
 | 
						|
        p2 = patch.object(Foo, 'two')
 | 
						|
 | 
						|
        mock_one = p1.start()
 | 
						|
        self.addCleanup(p1.stop)
 | 
						|
        mock_two = p2.start()
 | 
						|
        self.addCleanup(p2.stop)
 | 
						|
 | 
						|
        manager.attach_mock(mock_one, 'one')
 | 
						|
        manager.attach_mock(mock_two, 'two')
 | 
						|
 | 
						|
        Foo.two()
 | 
						|
        Foo.one()
 | 
						|
 | 
						|
        self.assertEqual(manager.mock_calls, [call.two(), call.one()])
 | 
						|
 | 
						|
 | 
						|
    def test_magic_methods_mock_calls(self):
 | 
						|
        for Klass in Mock, MagicMock:
 | 
						|
            m = Klass()
 | 
						|
            m.__int__ = Mock(return_value=3)
 | 
						|
            m.__float__ = MagicMock(return_value=3.0)
 | 
						|
            int(m)
 | 
						|
            float(m)
 | 
						|
 | 
						|
            self.assertEqual(m.mock_calls, [call.__int__(), call.__float__()])
 | 
						|
            self.assertEqual(m.method_calls, [])
 | 
						|
 | 
						|
 | 
						|
    def test_attribute_deletion(self):
 | 
						|
        # this behaviour isn't *useful*, but at least it's now tested...
 | 
						|
        for Klass in Mock, MagicMock, NonCallableMagicMock, NonCallableMock:
 | 
						|
            m = Klass()
 | 
						|
            original = m.foo
 | 
						|
            m.foo = 3
 | 
						|
            del m.foo
 | 
						|
            self.assertEqual(m.foo, original)
 | 
						|
 | 
						|
            new = m.foo = Mock()
 | 
						|
            del m.foo
 | 
						|
            self.assertEqual(m.foo, new)
 | 
						|
 | 
						|
 | 
						|
    def test_mock_parents(self):
 | 
						|
        for Klass in Mock, MagicMock:
 | 
						|
            m = Klass()
 | 
						|
            original_repr = repr(m)
 | 
						|
            m.return_value = m
 | 
						|
            self.assertIs(m(), m)
 | 
						|
            self.assertEqual(repr(m), original_repr)
 | 
						|
 | 
						|
            m.reset_mock()
 | 
						|
            self.assertIs(m(), m)
 | 
						|
            self.assertEqual(repr(m), original_repr)
 | 
						|
 | 
						|
            m = Klass()
 | 
						|
            m.b = m.a
 | 
						|
            self.assertIn("name='mock.a'", repr(m.b))
 | 
						|
            self.assertIn("name='mock.a'", repr(m.a))
 | 
						|
            m.reset_mock()
 | 
						|
            self.assertIn("name='mock.a'", repr(m.b))
 | 
						|
            self.assertIn("name='mock.a'", repr(m.a))
 | 
						|
 | 
						|
            m = Klass()
 | 
						|
            original_repr = repr(m)
 | 
						|
            m.a = m()
 | 
						|
            m.a.return_value = m
 | 
						|
 | 
						|
            self.assertEqual(repr(m), original_repr)
 | 
						|
            self.assertEqual(repr(m.a()), original_repr)
 | 
						|
 | 
						|
 | 
						|
    def test_attach_mock(self):
 | 
						|
        classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
 | 
						|
        for Klass in classes:
 | 
						|
            for Klass2 in classes:
 | 
						|
                m = Klass()
 | 
						|
 | 
						|
                m2 = Klass2(name='foo')
 | 
						|
                m.attach_mock(m2, 'bar')
 | 
						|
 | 
						|
                self.assertIs(m.bar, m2)
 | 
						|
                self.assertIn("name='mock.bar'", repr(m2))
 | 
						|
 | 
						|
                m.bar.baz(1)
 | 
						|
                self.assertEqual(m.mock_calls, [call.bar.baz(1)])
 | 
						|
                self.assertEqual(m.method_calls, [call.bar.baz(1)])
 | 
						|
 | 
						|
 | 
						|
    def test_attach_mock_return_value(self):
 | 
						|
        classes = Mock, MagicMock, NonCallableMagicMock, NonCallableMock
 | 
						|
        for Klass in Mock, MagicMock:
 | 
						|
            for Klass2 in classes:
 | 
						|
                m = Klass()
 | 
						|
 | 
						|
                m2 = Klass2(name='foo')
 | 
						|
                m.attach_mock(m2, 'return_value')
 | 
						|
 | 
						|
                self.assertIs(m(), m2)
 | 
						|
                self.assertIn("name='mock()'", repr(m2))
 | 
						|
 | 
						|
                m2.foo()
 | 
						|
                self.assertEqual(m.mock_calls, call().foo().call_list())
 | 
						|
 | 
						|
 | 
						|
    def test_attribute_deletion(self):
 | 
						|
        for mock in Mock(), MagicMock():
 | 
						|
            self.assertTrue(hasattr(mock, 'm'))
 | 
						|
 | 
						|
            del mock.m
 | 
						|
            self.assertFalse(hasattr(mock, 'm'))
 | 
						|
 | 
						|
            del mock.f
 | 
						|
            self.assertFalse(hasattr(mock, 'f'))
 | 
						|
            self.assertRaises(AttributeError, getattr, mock, 'f')
 | 
						|
 | 
						|
 | 
						|
    def test_class_assignable(self):
 | 
						|
        for mock in Mock(), MagicMock():
 | 
						|
            self.assertNotIsInstance(mock, int)
 | 
						|
 | 
						|
            mock.__class__ = int
 | 
						|
            self.assertIsInstance(mock, int)
 | 
						|
            mock.foo
 | 
						|
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    unittest.main()
 |