2011-03-15 35 views
2

我試圖用unittest測試下面的類和mock庫:嘲諷鏈式調用在Python

class Connection(object): 
    def __init__(self, cookie): 
    self.connect = None 
    self.session = Session() 
    self.session.load(cookie) 
    # do some stuff with self.session 
    self.some_info = self.session.data['the_info'] 

我怎麼能測試,如果當我創建的Connection一個實例,這取決於Session返回例如,我斷言如果self.some_info與我期待的價值?

我想使用模擬庫。在它的文檔中,我有一個模仿鏈接調用的例子(http://www.voidspace.org.uk/python/mock/examples.html#mocking-chained-calls),但是我不太清楚如何使它適應我的問題。

Session.load(cookie)方法在Session實例中設置了一些屬性。我想爲我的測試設置這個值,以確定每個cookie的值。

+1

你有什麼這麼遠嗎? – 2011-03-16 00:33:07

回答

3

假設Connection位於模塊package.module.connection

下面的代碼應該是你將如何測試您的會話:

import mock 


class TestConnection(unittest.TestCase): 

    @mock.patch('package.module.connection.Session') 
    def test_some_info_on_session_is_set(self, fake_session): 
     fake_session.data = {'the_info': 'blahblah'} 
     cookie = Cookie() 
     connection = Connection(cookie) 
     self.assertEqual(connection.some_info, 'blahblah') 
     fake_session.load.assert_called_once_with(cookie) 
+0

我之前並不瞭解修補程序修飾符。在你的回答之後,我再次閱讀模擬文檔,看到更好的方式(或唯一的:-))來完成我所需要的。 – 2011-03-16 21:00:18

+0

很高興我可以幫助:) – 2011-03-16 21:14:15

+0

不幸的是,如果我正在嘗試更改Session類的某些函數的返回值,那麼修補程序decorater是可以的。但是,如果我嘗試更改數據字典,則測試結果爲: TypeError:'Mock'對象不可訂閱 – 2011-03-17 02:59:13