Я пытаюсь высмеять свойство класса (декоратор @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