gpt4 book ai didi

python - 使用 Pytest 模拟 Python 类静态变量

转载 作者:行者123 更新时间:2023-12-04 16:45:03 25 4
gpt4 key购买 nike

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

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"

这似乎确实有效,但是对于单元测试是否有更简洁的方法来执行此操作?

最佳答案

旧但金。这是解决此问题的方法。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()

测试_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()

关于python - 使用 Pytest 模拟 Python 类静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46409030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com