【发布时间】:2021-11-01 03:52:42
【问题描述】:
我在尝试修补静态方法时遇到问题,无论我尝试了什么,原始方法仍在运行。我将在下面举例说明。
文件 A
import B
from unittest.mock import patch
from unittest import mock
import asynctest
import unittest
class Test(asynctest.TestCase):
@patch('B.OT._func')
async def test(self, mock_func):
mock_func.return_value = mock.MagicMock()
await B.foo()
mock_func.assert_called_once()
if __name__ == '__main__':
unittest.main()
文件B
from path.C import OT
async def foo():
print('B')
return OT._func()
路径(文件夹)/文件 C
class OT:
@staticmethod
def _func():
print('c')
return True
问题
我在模拟 OT._func() 的返回值时遇到问题。无论我尝试在文件 A 中修补什么,都不会阻止 _func() 在类 B 中运行。如果运行测试用例,它会打印出 'c' 而不是修补函数。我想要的结果是修补 _func 并让它返回其他内容。
编辑:问题似乎出在测试的异步部分,如果异步被删除,它可以工作。目前的解决方法是使用上下文管理器版本(带有关键字)来修补内容。
【问题讨论】:
-
您必须提供minimal reproducible example。
from c.TestClass import OT会抛出 ImportError,c中没有 没有 OT,而TestClass是c中的 类,你不能让它成为一部分导入路径,只能包含modules/packages -
老兄,代码仍然无法编译。还有没有B类。再说一次,它仍然不清楚你期望什么行为
-
看起来您正在尝试修补对象上的函数,这意味着您想使用
patch.objec()修补对象。见this。 -
@NathanielFord 嗨,我也尝试过使用 '@patch.object(B.OT, '_func')' 而不是 '@patch' ,但它仍然不起作用。
-
@juanpa.arrivillaga 我做了一些更改以使其更清晰。我复制粘贴代码并运行。也没有 B 类,它正在运行该文件中定义的函数。
标签: python python-3.x python-unittest python-unittest.mock