2012-03-18 44 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