【问题标题】:Patching class does not work its definition is get from dict修补类不起作用它的定义是从 dict 获取的
【发布时间】:2021-08-05 12:45:11
【问题描述】:

我在打补丁时遇到问题,如何正确地给A类打补丁?

a.py

class A:
    pass

插件.py

from a import A

CONFIG = {'aenum': A}

def do():
   instance = CONFIG['aenum']()  # the A class is NOT patched using this
   # instance = A()  # the test passes with this
   return instance.auth()

test.py(使用pytest运行)

from unittest.mock import Mock, patch
import plugin

def test_do():
    a_instance_mock = Mock()
    a_instance_mock.auth.return_value = 42
    with patch("plugin.A", return_value=a_instance_mock):
        assert plugin.do() == 42 

【问题讨论】:

    标签: pytest patch


    【解决方案1】:

    patch 仅覆盖给定命名空间中的特定项目;类名是在导入模块后修补的,而不是在导入时。

    这就是 CONFIG["aenum"] 保持不变的原因。

    改用patch.dict

    from unittest.mock import Mock, patch
    from plugin import do
    
    def test_do():
        a_instance_mock = Mock()
        a_instance_mock.authenticate.return_value = 42
        a_class_mock = Mock(return_value=a_instance_mock)
        with patch.dict("plugin.CONFIG", {"aenum": a_class_mock}):
            assert do() == 42
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2021-09-03
      • 2019-03-05
      • 2020-03-07
      相关资源
      最近更新 更多