如何模拟一个属性抛出异常?

7
我正在使用Python 2.7中的MagicMock来模拟对象。 我要模拟的类之一具有属性,其中一个属性在某些情况下可能会引发 TypeError
我想模拟这种行为,但我无法弄清楚如何做到:
  • del my_mock.my_property将在访问 my_property 时导致 AttributeError ,但我需要 TypeError
  • my_mock.my_property = MagicMock(side_effect=TypeError)会在调用 my_property 时引发 TypeError ,但在仅访问 my_property 时不会。
我该怎么办?

只是一个想法:第二个选项 + my_mock.my_property = property(my_mock.my_property) - Klaus D.
也许可以将该属性定义为一个类,该类定义了一个 __delattr__ 方法,在删除时改变其行为。 - wwii
也许更准确地说,为模拟对象定义一个__delattr__方法,以在删除属性时改变其行为。 - wwii
我们可以将该属性制作成一个描述符,在删除时执行类似的操作。 - wwii
1个回答

8
您可以使用PropertyMock来实现此目的:
import mock

class A(object):

    @property
    def prop(self):
        pass

a = A()
type(a).prop = mock.PropertyMock(side_effect=TypeError)

如果你现在访问 a.prop,它会引发一个 TypeError

1
那看起来就是我需要的,我会在周一检查一下。我也可以在 MagicMock 实例上设置它吗? - zneak
这很好,除非你想使用自定义消息引发AttributeError,side_effect=AttributeError('something')。然后side_effect将被完全忽略。 - fulv
参见:https://dev59.com/lmMl5IYBdhLWcg3wp4Wk - fulv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接