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

dev*_*v ツ 0 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.....
Run Code Online (Sandbox Code Playgroud)

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

如果有 20 个补丁对象,方法会一样吗?

rda*_*das 5

从补丁文档:

当您嵌套补丁装饰器时,模拟将按照它们应用的相同顺序(应用装饰器的正常 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.....
Run Code Online (Sandbox Code Playgroud)

如果你有很多这样的模拟并且你不需要在每个模拟中做任何事情(比如定义 side_effect 等),*args为了简洁起见,你可以把它们汇总起来。