python-unittest - Python unittest 模拟一个对象,使其不具有属性

标签 python-unittest python-unittest.mock

我有一个函数,如果对象具有某个属性,它会运行一些代码;在极少数情况下,如果对象没有该属性,它会运行不同的代码。我很难创建没有测试属性的对象。我尝试了 del instance.attribute 但出现错误。该属性实际上是一个 @property 底层。

我有一个具有 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

关于python-unittest - Python unittest 模拟一个对象,使其不具有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72830782/

相关文章:

Python单元测试,测试用例之前的声明

Python单元测试多个输入

python - pytest:如何获取从模拟类返回的(模拟)实例?

python - 在 pathlib.Path 上模拟 open() 以使用 unittest.mock 返回模拟文件句柄

Python SQLAlchemy 模拟

python - pytest 不会使用 mock.patch 引发 HTTPError

python - 编写扩展Python单元测试的自定义fail()方法

python - 在 Python 中获得响应后模拟 requests.json

python - 为什么我的带有线程的 Python unittest 测试用例挂起?