模拟模块属性

问题描述 投票:0回答:1

我正在尝试模拟位于模块根目录的属性:

some_module.py

@property
def conn(self):
    if not get_request():
        raise SomeError(
            "Some error happened"
        )
    return get_request().connection


Database.conn = conn

我尝试了很多不同的方法,例如:

@mock.patch("some_module.conn")
def test_some_test(mock_conn):
    mock_conn.return_value = mock.Mock()

..

@mock.patch("some_module.conn", new_callable=PropertyMock)
def test_some_test(mock_conn):
    mock_conn.return_value = mock.Mock()

..

@mock.patch("some_module.conn", new_callable=PropertyMock, return_value=mock.Mock())
def test_some_test():
    ...

但是我没有成功。我知道如果该属性属于这样的类,其中一些方法会起作用:

MyClass:
    @property
    def conn(self):
        if not get_request():
            raise SomeError(
                "Some error happened"
            )
        return get_request().connection

但就我而言,该属性必须位于模块的根目录中,现在我正在努力模拟它。有人知道如何嘲笑它吗?

更新

conn
视为变量并尝试像全局变量一样模拟它也不起作用:

@mock.patch("some_module.conn", mock.Mock())
def test_some_test():
    ...
python mocking pytest
1个回答
0
投票

据我所知,属性装饰器用于在类中定义可以像属性一样访问的方法。

以这种方式使用房产背后的价值是什么?你不能调用 conn() 吗?

即使在官方文档中,您也可以看到使用类内属性的示例。 https://docs.python.org/3/howto/descriptor.html#properties

我什至怀疑

Database.conn = conn
是否有效。有效吗?难道你不需要通过 conn.fget() 来访问它吗?

© www.soinside.com 2019 - 2024. All rights reserved.