Python中静态方法的异步修补问题

2024-10-02 18:17:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试修补静态方法时遇到问题,无论我尝试了什么,原始方法仍在运行。我将在下面举例说明

归档

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.\u func()的返回值时遇到问题。无论我在文件A中尝试修补什么,都不会阻止_func()在类B中运行。如果运行测试用例,它会打印出“c”,而不是修补函数。我想要的结果是修补_func并让它返回其他内容

编辑:问题似乎出在测试的异步部分,如果异步被删除,它就会工作。目前的一个解决方法是使用上下文管理器版本(带关键字)来修补内容


Tags: 文件方法fromimportasyncreturnfoodef
1条回答
网友
1楼 · 发布于 2024-10-02 18:17:15

在进一步研究之后,似乎是async和“@patch”装饰器(以及可能的python 3.7)的问题。一个简单的解决方法是在“with”关键字旁边使用补丁。这将绕过不适用于异步函数的补丁修饰符

或者,从python 3.7.2升级到3.8.2也解决了这个问题,并允许修补程序装饰程序使用异步函数

相关问题 更多 >