在单元测试中使用补丁时模拟对象的顺序

时间:2019-05-02 12:32:15

标签: python mocking python-unittest

@patch('module1.api.method1')  
@patch('module1.api.method2')
class TestApi(unittest.TestCase):

        @patch('module1.api.connec1')    
        @patch('module1.api.connec2')  
        def test_some_method(self, mockMethod1, mockMethod2, 
                                mockConnec1, mockConnec2):
            # some code.....

测试方法中提到的模拟对象的顺序是否应该与patch相同?我们是否需要为所有类级别和方法级别的补丁提及模拟对象?

如果有大约20个补丁对象,方法是否会相同?

1 个答案:

答案 0 :(得分:4)

来自补丁文档:

  

当您嵌套补丁装饰器时,模拟将传递到   装饰函数以它们应用的顺序排列(普通的Python   应用装饰器的顺序)。这意味着从下往上

因此,您代码中的正确顺序为:

@patch('module1.api.method1')  
@patch('module1.api.method2')
class TestApi(unittest.TestCase):

        @patch('module1.api.connec1')    
        @patch('module1.api.connec2')  
        def test_some_method(self, mockConnec2, mockConnec1, mockMethod2, mockMethod1):
         # some code.....

如果您有很多这样的模拟,而您在每个模拟中都不需要做任何事情(例如定义side_effect等),那么为了简便起见,您可以将它们与*args进行汇总。