我正在尝试模拟位于模块根目录的属性:
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():
...
据我所知,属性装饰器用于在类中定义可以像属性一样访问的方法。
以这种方式使用房产背后的价值是什么?你不能调用 conn() 吗?
即使在官方文档中,您也可以看到使用类内属性的示例。 https://docs.python.org/3/howto/descriptor.html#properties
我什至怀疑
Database.conn = conn
是否有效。有效吗?难道你不需要通过 conn.fget() 来访问它吗?