gpt4 book ai didi

python - 如何在python中模拟依赖

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:03 25 4
gpt4 key购买 nike

我是 python 单元测试框架的新手,在模拟依赖方面有很多困惑。

我正在尝试为类的以下成员函数编写单元测试,(check_something()):

class Validations:    
def check_something(self):
abc = os.environ['PLATFORM']
xyz = Node()
no_of_nodes = len(xyz.some_type_var)
if abc != "X_PLATFORM" or no_of_nodes != 1:
raise someException()

我们如何消除依赖性?

  1. 需要模拟 Node() 吗?
  2. 我们如何确保 abc 已分配给 X_PLATFORM
  3. 如何将值1 赋给变量no_of_nodes?它又派生自 Node() 对象。

    class Node(object):
    def __init__(self):
    self.nodes = DEF()
    self.some_type_var = someclass().getType()
    self.localnode = os.environ['HOSTNAME']
    self.peertype = self.get_peer_type()

    def get_peer_type(self):
    return node

我试着写下面的单元测试。我无法检查失败和通过条件。我不确定它是否正确。

class TestValidation(unittest.TestCase):

@mock.patch.object(Node, "get_peer_type")
@mock.patch('somefile.Node', spec=True)
def test_1(self, mock_object1, mock_object2):
os.environ['PLATFORM'] = 'X_PLATFORM'
obj = Validations()
self.assertRaises(someException, obj.check_something)

验证类使用 Node() 类对象,Node 类使用其他类。

  1. 如何根据条件确定是否引发异常?

最佳答案

是的,您可以模拟被测代码单元外部的任何内容。这意味着 os.environ字典和 Node()类。

补丁需要应用到你的代码所在的模块; @mock.patch('somefile.Node', spec=True)如果 somefile 是正确的与 Validations 是同一个模块;查看Where to patch section至于为什么会这样。

我不确定使用 spec=True在这里有用吗?你的Node attributes 是在 Node.__init__ 中创建的所有实例属性,因此它们在 class 上不可用,这是通知规范的内容。请参阅有关 autospeccing 的部分如果你真的想设定一个规范,如何克服这个问题。

abc设置自 os.environ , 您可以使用 patch.dict() object根据您的需要修补该词典。

xyz = len(xyz.some_type_var)只需通过设置 some_type_var 来处理通过设置 xyz.some_type_var.__len__.return_value 将属性赋予具有正确长度的对象, , 因为它是 xyz.some_type_var.__len__()len() 调用的方法功能。

因此,要进行测试,您需要:

class TestValidation(unittest.TestCase):
@mock.patch('somefile.Node')
def test_1(self, mock_node):
# set up the Node() instance, with the correct length
node_instance = mock_node.return_value
node_instance.some_type_var.__len__ = 2
# or, alternatively, node_instance.some_type_var = (1, 2)

# set up os.environ['PLATFORM']
with mock.patch.dict('os.environ', PLATFORM='X_PLATFORM'):
obj = Validations()
with self.assertRaises(someException):
obj.check_something()

关于python - 如何在python中模拟依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672906/

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