【问题标题】:Async Patching issue with static methods in PythonPython中静态方法的异步修补问题
【发布时间】: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 examplefrom c.TestClass import OT 会抛出 ImportError,c 中没有 没有 OT,而 TestClassc 中的 ,你不能让它成为一部分导入路径,只能包含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


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多