繁体   English   中英

如何在python中模拟依赖

[英]how to mock dependency in python

我是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. 如何为变量no_of_nodes赋值1 而这又是从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()类。

补丁需要应用于您的代码所在的模块; 如果somefileValidations是同一个模块,那么@mock.patch('somefile.Node', spec=True)是正确的。 请参阅“ 补丁的位置”部分 ,了解其原因。

我不确定使用spec=True在这里是否有用; 您的Node属性是在Node.__init__创建的所有实例属性,因此它们在上不可用,这是通知规范的。 如果您确实想要设置规范,请参阅有关如何克服该问题的自动指定部分。

abc是从os.environ设置的,你可以使用patch.dict()对象根据需要修补该字典。

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM