我试图模拟一个类的属性(@property 装饰器)并遇到了这种不正确的行为:
>>> from mock import MagicMock, PropertyMock
>>> m = MagicMock()
>>> type(m).p = PropertyMock(side_effect=AttributeError)
>>> m.p
<MagicMock name='mock.p' id='63150736'>
正确的行为是这样的:
>>> from mock import MagicMock, PropertyMock
>>> m = MagicMock()
>>> type(m).p = PropertyMock(side_effect=ValueError)
>>> m.p
Traceback (most recent call last)
[...]
ValueError
我无法理解为什么设置不同的例外会给我不同的结果。这两种情况的预期结果是应该引发异常!因此, In[4] 行应该引发AttributeError
. 它不是。
有人愿意开导我吗?
附录:我要检查的属性会进行一些巧妙的检查,以查看传递的值是否正常。如果所述值不正常,它会返回 AttributeError ,因为我知道这是 Python 中的正确异常。因此,我需要检查使用该属性的代码是否成功以及是否成功。因此,使用 MagicMock 来模拟属性并引发所述异常。一个简单的例子是:
@x.setter
def x(self, value):
if value < 0:
raise AttributeError("Value cannot be negative!")
self._x = value