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 也解决了这个问题并允许补丁装饰器使用异步函数。