2013-04-17 128 views
11

第一次使用補丁。我試圖修補我的一個課程進行測試。如果沒有補丁嘗試運行不會越過測試功能的定義,但有補丁的測試功能定義顯然需要另一個參數,我得到一個補丁 - 補丁類引入了一個額外的參數?

TypeError: testAddChannelWithNamePutsChannel() takes exactly 1 argument (2 given) 

錯誤。測試代碼如下:

import unittest 
import mock 
from notification.models import Channel, addChannelWithName, deleteChannelWithName 

class TestChannel(unittest.TestCase): 
    @mock.patch('notification.models.Channel') 
    def testAddChannelWithNamePutsChannel(self): 
     addChannelWithName('channel1') 
     Channel.put.assert_called_with() 

爲什麼它需要一個額外的參數與補丁和該參數是什麼?非常感謝!

+2

嘗試使用'self,* args'而不是'self'並打印出'args'。 –

回答

6

patch將修補後的對象傳遞給測試函數。它記載here

補丁的功能,裝飾,爲您創建模擬和傳遞 到裝飾功能:

>>> 
>>> @patch('__main__.SomeClass') 
... def function(normal_argument, mock_class): 
...  print(mock_class is SomeClass) 
... 
>>> function(None) 
True 
23

修補通過在修補對象的實例來測試方法(或者如果您在課堂級別進行修補,則適用於每種測試方法)。這是方便,因爲它可以讓你設置返回值和副作用,或支票支付

@patch('some_module.sys.stdout') 
def test_something_with_a_patch(self, mock_sys_stdout): 
    mock_sys_stdout.return_value = 'My return value from stdout' 

    my_function_under_test() 

    self.assertTrue(mock_sys_stdout.called) 
    self.assertEqual(output, mock_sys_stdout.return_value) 

的呼叫如果您只是想從字面上修補出來的東西不理它,那麼你可以調用用下面的調用補丁

@patch('some_module.sys.stdout', Mock()) 
def test_something_with_a_patch(self): 

使用模擬對象替換some_module中的sys.stdout,但不會將其傳遞給方法。