如何在python中模拟依赖

san*_*dra 3 python unit-testing mocking

我是 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()
Run Code Online (Sandbox Code Playgroud)

我们如何消除依赖?

  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
    
    Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 5

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

补丁需要应用到你的代码所在的模块;@mock.patch('somefile.Node', spec=True)如果somefile与模块相同,则正确Validations;有关原因,请参阅修补位置部分。

我不确定使用spec=True在这里是否有帮助;您的Node属性都是在 中创建的实例属性Node.__init__,因此它们在类上不可用,这就是规范的内容。参见节autospeccing如何克服,如果你真的想设置一个规范。

abc设置 from 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()
Run Code Online (Sandbox Code Playgroud)