bpo-35357: Add _mock_ prefix to name/parent/from_kall attributes of _Call/_MagicProxy. (#10873)
Fix minor typo in test function name.
This commit is contained in:
parent
eeb719eac6
commit
e63e617ebb
|
@ -2040,9 +2040,9 @@ class _Call(tuple):
|
|||
|
||||
def __init__(self, value=(), name=None, parent=None, two=False,
|
||||
from_kall=True):
|
||||
self.name = name
|
||||
self.parent = parent
|
||||
self.from_kall = from_kall
|
||||
self._mock_name = name
|
||||
self._mock_parent = parent
|
||||
self._mock_from_kall = from_kall
|
||||
|
||||
|
||||
def __eq__(self, other):
|
||||
|
@ -2059,8 +2059,8 @@ class _Call(tuple):
|
|||
else:
|
||||
self_name, self_args, self_kwargs = self
|
||||
|
||||
if (getattr(self, 'parent', None) and getattr(other, 'parent', None)
|
||||
and self.parent != other.parent):
|
||||
if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None)
|
||||
and self._mock_parent != other._mock_parent):
|
||||
return False
|
||||
|
||||
other_name = ''
|
||||
|
@ -2104,17 +2104,17 @@ class _Call(tuple):
|
|||
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
if self.name is None:
|
||||
if self._mock_name is None:
|
||||
return _Call(('', args, kwargs), name='()')
|
||||
|
||||
name = self.name + '()'
|
||||
return _Call((self.name, args, kwargs), name=name, parent=self)
|
||||
name = self._mock_name + '()'
|
||||
return _Call((self._mock_name, args, kwargs), name=name, parent=self)
|
||||
|
||||
|
||||
def __getattr__(self, attr):
|
||||
if self.name is None:
|
||||
if self._mock_name is None:
|
||||
return _Call(name=attr, from_kall=False)
|
||||
name = '%s.%s' % (self.name, attr)
|
||||
name = '%s.%s' % (self._mock_name, attr)
|
||||
return _Call(name=name, parent=self, from_kall=False)
|
||||
|
||||
|
||||
|
@ -2125,8 +2125,8 @@ class _Call(tuple):
|
|||
return self.__getattr__('index')(*args, **kwargs)
|
||||
|
||||
def __repr__(self):
|
||||
if not self.from_kall:
|
||||
name = self.name or 'call'
|
||||
if not self._mock_from_kall:
|
||||
name = self._mock_name or 'call'
|
||||
if name.startswith('()'):
|
||||
name = 'call%s' % name
|
||||
return name
|
||||
|
@ -2152,9 +2152,9 @@ class _Call(tuple):
|
|||
vals = []
|
||||
thing = self
|
||||
while thing is not None:
|
||||
if thing.from_kall:
|
||||
if thing._mock_from_kall:
|
||||
vals.append(thing)
|
||||
thing = thing.parent
|
||||
thing = thing._mock_parent
|
||||
return _CallList(reversed(vals))
|
||||
|
||||
|
||||
|
|
|
@ -128,7 +128,7 @@ class TestCallable(unittest.TestCase):
|
|||
result.foo.assert_called_once_with(3, 2, 1)
|
||||
|
||||
|
||||
def test_create_autopsec(self):
|
||||
def test_create_autospec(self):
|
||||
mock = create_autospec(X)
|
||||
instance = mock()
|
||||
self.assertRaises(TypeError, instance)
|
||||
|
|
|
@ -9,7 +9,7 @@ from unittest import mock
|
|||
from unittest.mock import (
|
||||
call, DEFAULT, patch, sentinel,
|
||||
MagicMock, Mock, NonCallableMock,
|
||||
NonCallableMagicMock, _CallList,
|
||||
NonCallableMagicMock, _Call, _CallList,
|
||||
create_autospec
|
||||
)
|
||||
|
||||
|
@ -1665,6 +1665,20 @@ class MockTest(unittest.TestCase):
|
|||
self.assertIsInstance(mock, int)
|
||||
mock.foo
|
||||
|
||||
def test_name_attribute_of_call(self):
|
||||
# bpo-35357: _Call should not disclose any attributes whose names
|
||||
# may clash with popular ones (such as ".name")
|
||||
self.assertIsNotNone(call.name)
|
||||
self.assertEqual(type(call.name), _Call)
|
||||
self.assertEqual(type(call.name().name), _Call)
|
||||
|
||||
def test_parent_attribute_of_call(self):
|
||||
# bpo-35357: _Call should not disclose any attributes whose names
|
||||
# may clash with popular ones (such as ".parent")
|
||||
self.assertIsNotNone(call.parent)
|
||||
self.assertEqual(type(call.parent), _Call)
|
||||
self.assertEqual(type(call.parent().parent), _Call)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
Internal attributes' names of unittest.mock._Call and
|
||||
unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with
|
||||
_mock_ in order to prevent clashes with widely used object attributes.
|
||||
Fixed minor typo in test function name.
|
Loading…
Reference in New Issue