unittest.mock.PropertyMock return value and attributes are now standard MagicMocks

This commit is contained in:
Michael Foord 2012-04-13 16:57:22 +01:00
parent 633b32a7fa
commit c287062fcf
3 changed files with 25 additions and 0 deletions

View File

@ -712,6 +712,17 @@ have to create a dictionary and unpack it using `**`:
>>> mock_foo.mock_calls >>> mock_foo.mock_calls
[call(), call(6)] [call(), call(6)]
Because of the way mock attributes are stored you can't directly attach a
`PropertyMock` to a mock object. Instead you can attach it to the mock type
object::
>>> m = MagicMock()
>>> p = PropertyMock(return_value=3)
>>> type(m).foo = p
>>> m.foo
3
>>> p.assert_called_once_with()
Calling Calling
~~~~~~~ ~~~~~~~

View File

@ -2166,6 +2166,9 @@ class PropertyMock(Mock):
Fetching a `PropertyMock` instance from an object calls the mock, with Fetching a `PropertyMock` instance from an object calls the mock, with
no args. Setting it calls the mock with the value being set. no args. Setting it calls the mock with the value being set.
""" """
def _get_child_mock(self, **kwargs):
return MagicMock(**kwargs)
def __get__(self, obj, obj_type): def __get__(self, obj, obj_type):
return self() return self()
def __set__(self, obj, val): def __set__(self, obj, val):

View File

@ -831,5 +831,16 @@ class TestCallList(unittest.TestCase):
p.stop() p.stop()
def test_propertymock_returnvalue(self):
m = MagicMock()
p = PropertyMock()
type(m).foo = p
returned = m.foo
p.assert_called_once_with()
self.assertIsInstance(returned, MagicMock)
self.assertNotIsInstance(returned, PropertyMock)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()