Commit c287062f authored by Michael Foord's avatar Michael Foord

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

parent 633b32a7
...@@ -712,6 +712,17 @@ have to create a dictionary and unpack it using `**`: ...@@ -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
~~~~~~~ ~~~~~~~
......
...@@ -2166,6 +2166,9 @@ class PropertyMock(Mock): ...@@ -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):
......
...@@ -831,5 +831,16 @@ class TestCallList(unittest.TestCase): ...@@ -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()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment