2012-03-18 24 views
4

我一直在使用mock库来做我的一些测试。到目前为止,这一切都很棒,但还有一些我还没有完全理解的东西。蟒蛇 - 访问对象与修补程序嘲笑

mock提供使用patch打补丁的整个方法的一个很好的方式,我可以访问修补对象的方法,像这样:

@patch('package.module') 
def test_foo(self, patched_obj): 
    # ... call patched_obj here 
    self.assertTrue(patched_obj.called) 

我的问题是,我该如何访问一个补丁的对象,如果我在整个课堂上使用patch修饰器?

例如:

@patch('package.module') 
class TestPackage(unittest.TestCase): 

    def test_foo(self): 
     # how to access the patched object? 

回答

8

在这种情况下,test_foo将有一个额外的参数,以同样的方式,当您装饰方法。如果你的方法也被修补,但那些ARGS将被添加以及:

@patch.object(os, 'listdir') 
class TestPackage(unittest.TestCase): 
    @patch.object(sys, 'exit') 
    def test_foo(self, sys_exit, os_listdir): 
     os_listdir.return_value = ['file1', 'file2'] 
     # ... Test logic 
     sys_exit.assert_called_with(1) 

的参数顺序由装饰调用的顺序确定。方法装饰器首先被调用,所以它附加第一个参数。类装饰器是外部的,所以它会添加第二个参数。将几个修补程序修饰器附加到相同的测试方法或类时(即外部修饰器最后一个)也是如此。

+0

啊,是的,谢谢!我应该先检查一下。这种情况下的排序是如何确定的?另外,是否可以在第一个打过补丁的模块上应用另一个补丁(例如,如果''package.module''有几个具有不同返回值的对象,我想模拟它们)? – bow 2012-03-18 12:14:41

+0

我已经更新了答案。您可以根据需要使用尽可能多的修补程序修饰器。 – bereal 2012-03-18 12:19:49

+0

真棒,谢谢:)! – bow 2012-03-18 12:22:27