from unittest import mock
class MyClass(object):
def __int__(self):
self.my_attribute = 10
@property
def my_property(self):
return self.my_attribute + 1
def unit_under_test():
inst = MyClass()
return inst.my_property
class MyMock(mock.PropertyMock):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("MyMock __init__ called.")
with mock.patch.object(mock, 'MagicMock', MyMock) as property_mock:
with mock.patch.object(MyClass, 'my_property', autospec=True) as spy:
property_mock.side_effect = lambda self: 2
# or property_mock.return_value = 2
result = unit_under_test()
assert result == 2
assert spy.call_count == 1
ZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jawoKY2xhc3MgTXlDbGFzcyhvYmplY3QpOgogICAgZGVmIF9faW50X18oc2VsZik6CiAgICAgICAgc2VsZi5teV9hdHRyaWJ1dGUgPSAxMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG15X3Byb3BlcnR5KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm15X2F0dHJpYnV0ZSArIDEKCmRlZiB1bml0X3VuZGVyX3Rlc3QoKToKICAgIGluc3QgPSBNeUNsYXNzKCkKICAgIHJldHVybiBpbnN0Lm15X3Byb3BlcnR5CgpjbGFzcyBNeU1vY2sobW9jay5Qcm9wZXJ0eU1vY2spOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcHJpbnQoIk15TW9jayBfX2luaXRfXyBjYWxsZWQuIikKCndpdGggbW9jay5wYXRjaC5vYmplY3QobW9jaywgJ01hZ2ljTW9jaycsIE15TW9jaykgYXMgcHJvcGVydHlfbW9jazoKICAgIHdpdGggbW9jay5wYXRjaC5vYmplY3QoTXlDbGFzcywgJ215X3Byb3BlcnR5JywgYXV0b3NwZWM9VHJ1ZSkgYXMgc3B5OgogICAgICAgIHByb3BlcnR5X21vY2suc2lkZV9lZmZlY3QgPSBsYW1iZGEgc2VsZjogMgogICAgICAgICMgb3IgcHJvcGVydHlfbW9jay5yZXR1cm5fdmFsdWUgPSAyCiAgICAgICAgcmVzdWx0ID0gdW5pdF91bmRlcl90ZXN0KCkKICAgICAgICBhc3NlcnQgcmVzdWx0ID09IDIKICAgICAgICBhc3NlcnQgc3B5LmNhbGxfY291bnQgPT0gMQ==