【问题标题】:Mocking a Python class static variable with Pytest使用 Pytest 模拟 Python 类静态变量
【发布时间】:2017-09-25 15:35:58
【问题描述】:

我正在尝试为依赖于系统库的类正确创建模拟。目前,代码在测试时会连接到库的套接字,我正在尝试删除该依赖项。

class A:
    SETTING_VARIABLE = "CONFIG_VALUE"

    def __init__(self):
        self.system_connector = library.open(self.SETTING_VARIABLE)


import A

class B:
    INSTANCE_OF_A = A()

当类 A 被实例化时,它使用 SETTING_VARIABLE 连接到系统库,在单元测试期间它不能这样做,并且我的测试套件在测试收集期间失败。我使用的库连接器可以配置为在单元测试模式下运行,但需要传递不同的配置,因此在这种情况下,需要将 SETTING_VARIABLE 实例化为“TEST_VALUE”。

我的测试类 test_B 在尝试连接到系统库时一旦导入 B 就会失败(我已禁用对它的套接字的访问)。如何设置 Python 模拟,以便我可以替换 A 定义的静态变量的值?

我尝试从 test_B 做的一件事:

import A
A.SETTING_VARIABLE = "TEST_VALUE"

这似乎确实有效,但是对于单元测试有更简洁的方法吗?

【问题讨论】:

    标签: python unit-testing pytest


    【解决方案1】:

    旧但黄金。这是解决此问题的方法。 需要更改 B 类以在其构造函数中初始化 INSTANCE_OF_A。然后你可以使用 patch.object 模拟SETTING_VARIABLE

    以 patch.object 作为指令或装饰器的完整示例:

    A.py:

    class A:
        SETTING_VARIABLE = "CONFIG_VALUE"
    
        def __init__(self):
            self.system_connector = library.open(self.SETTING_VARIABLE)
    

    B.py:

    from A import A
    
    class B:
        def __init__(self):
            self.INSTANCE_OF_A = A()
    

    test_B.py

    import unittest
    from unittest.mock import patch
    
    from A import A
    from B import B
    
    class BTestCase(unittest.TestCase):
    
        @patch.object(A, "SETTING_VARIABLE", "TEST_VALUE")
        def test_b_with_decorator(self):
            INSTANCE_OF_B = B()
    
        def test_b_with_instruction(self):
            with patch.object(A, "SETTING_VARIABLE", "TEST_VALUE"):
                INSTANCE_OF_B = B()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多