Python 中静态方法的异步修补问题
Async Patching issue with static methods in Python
我在尝试修补静态方法时遇到问题,无论我尝试了什么,原始方法仍然是 运行。我将在下面举例说明。
文件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() 的 return 值时遇到问题。无论我尝试在文件 A 中修补什么,都不会停止 class B 中 运行 的 _func()。如果测试用例是 运行,它会打印出 'c' 而不是修补功能。我想要的结果是修补 _func 并让它 return 其他东西。
编辑:问题似乎出在测试的异步部分,如果删除了异步,它就可以工作。目前的解决方法是使用上下文管理器版本(带关键字)来修补内容。
在深入研究之后,似乎是异步和“@patch”装饰器的问题(可能 python 3.7)。一个简单的解决方法是将补丁与 'with' 关键字一起使用。这将绕过不适用于异步函数的补丁装饰器。
或者,从 python 3.7.2 升级到 3.8.2 也解决了这个问题并允许补丁装饰器使用异步函数。
我在尝试修补静态方法时遇到问题,无论我尝试了什么,原始方法仍然是 运行。我将在下面举例说明。
文件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() 的 return 值时遇到问题。无论我尝试在文件 A 中修补什么,都不会停止 class B 中 运行 的 _func()。如果测试用例是 运行,它会打印出 'c' 而不是修补功能。我想要的结果是修补 _func 并让它 return 其他东西。
编辑:问题似乎出在测试的异步部分,如果删除了异步,它就可以工作。目前的解决方法是使用上下文管理器版本(带关键字)来修补内容。
在深入研究之后,似乎是异步和“@patch”装饰器的问题(可能 python 3.7)。一个简单的解决方法是将补丁与 'with' 关键字一起使用。这将绕过不适用于异步函数的补丁装饰器。
或者,从 python 3.7.2 升级到 3.8.2 也解决了这个问题并允许补丁装饰器使用异步函数。