我试图模拟一个类的属性(@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
。它不是。
有人愿意启发我吗?
Addendum:我试图检查的属性会进行一些巧妙的检查,以查看传递的值是否正常。如果所述值不正常,它会返回 AttributeError,据我所知,这是 Python 中的正确异常。因此,我需要检查使用该属性的代码是否成功以及失败。因此,使用 MagicMock 来模拟该属性并引发所述异常。一个简单的例子是:
@x.setter
def x(self, value):
if value < 0:
raise AttributeError("Value cannot be negative!")
self._x = value
我知道这个问题很旧,但我刚刚遇到了同样的问题并发现了这个问题。还有错误报告 http://code.google.com/p/mock/issues/detail?id=219大约两年前提交的似乎没有引起任何关注,所以我想我会分享我找到的解决方案,以防其他人遇到这个问题。
所以,正如所说PropertyMock
不适用于AttributeError
设置为side_effect
。解决方法是创建一个简单的Mock
with a spec
属性设置为空list
像这样:
>>> from mock import Mock
>>> m = Mock(spec=[])
>>> m.p
Traceback (most recent call last)
[...]
AttributeError
如中所述docs http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock:
spec:这可以是字符串列表,也可以是充当模拟对象规范的现有对象(类或实例)。如果传入一个对象,则通过在该对象上调用 dir 来形成字符串列表(不包括不支持的魔法属性和方法)。访问任何不在此列表中的属性都会引发 AttributeError。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)