Python unittest Mock对象没有一个属性



我有一个函数,如果对象有某个属性,它运行一些代码,在极少数情况下,如果对象没有该属性,它运行不同的代码。对于我来说,如果没有用于测试的属性,就很难创建对象。我尝试了del instance.attribute,但得到了一个错误。该属性实际上是一个@property

我有一个对象instance,它具有foo属性。如何模拟它,以便当一个人试图访问instance.foo时,如果没有属性,它会像往常一样引发AttributeError?

我试过mock.Mock(side_effect=AttributeError('Boom!')),但它只适用于方法。

您可以尝试为属性使用PropertyMock,通常您应该能够设置相应的副作用。下面是一个简单的工作示例:

from unittest import mock
import pytest
class Foo:
@property
def bar(self):
return "bar"

def test_no_foo():
bar_mock = mock.PropertyMock()
with mock.patch(f"{__name__}.Foo.bar", bar_mock):
bar_mock.side_effect = AttributeError('Boom!')
foo = Foo()
with pytest.raises(AttributeError):
foo.bar

当你在类中而不是在对象中修补属性时,如果你通过访问对象的类来访问对象,你也可以使用patch.object来做这件事:

def test_no_foo():
bar_mock = mock.PropertyMock()
foo = Foo()
with mock.patch.object(foo.__class__, "bar", bar_mock):
bar_mock.side_effect = AttributeError('Boom!')
with pytest.raises(AttributeError):
foo.bar

最新更新