2014-02-27 45 views
4

我在編寫測試用例時丟失了一點點UserCompanyRateLimitValidation class。我發現模擬正在從這個類內部實例化的類是很困難的。Python mockito - 嘲笑正在從可測試函數實例化的類

class UserCompanyRateLimitValidation: 
    def __init__(self, user_public_key): 
     self.adapter = UserAdapter(user_public_key) 
     container = self.adapter.get_user_company_rate_limit() 
     super(UserCompanyRateLimitValidation, self).__init__(container,\ 
              UserCompanyRateLimitValidation.TYPE) 

我必須測試這個類。我寫過測試用例。我試圖嘲笑UserAdapter類,但我無法完全做到這一點。

def test_case_1(): 
    self.user_public_key = 'TEST_USER_PUBLIC_KEY_XXXXXX1234567890XXXXX' 
    UserAdapter_mock = mock(UserAdapter) 
    when(UserAdapter_mock).get_user_company_rate_limit().\ 
              thenReturn(get_fake_container_object()) 

    self.test_obj = UserCompanyRateLimitValidation(self.user_public_key) 

在這裏,如果你看,我嘲笑get_user_company_rate_limit()從檢驗的函數調用,container = self.adapter.get_user_company_rate_limit() 但我仍然無法弄清楚,我可以嘲笑這種調用方式,

self.adapter = UserAdapter(user_public_key) 

回答

2

如果你知道這個技巧,這很簡單。

在Python中創建對象非常類似於對類對象的函數調用。 UserCompanyRateLimitValidation正在'調用'UserAdapter(user_public_key)。你想存根那個'call'的返回值返回UserAdapter_mock

你可以像存儲模塊中的函數一樣存根。你錯過了該生產線是:

when(module_declaring_UserAdapter)\ 
    .UserAdapter(self.user_public_key)\ 
    .thenReturn(UserAdapter_mock) 

此後,呼喚module_declaring_UserAdapter.UserAdapter(self.user_public_key)將返回UserAdapter_mock

這裏的手冊中的鏈接部分:https://code.google.com/p/mockito-python/wiki/Stubbing#Modules

你要小心選擇合適的module_declaring_UserAdapter,由於方式from ... import ...聲明的作品。從你的代碼中,我會說你必須選擇宣告UserCompanyRateLimitValidation的模塊。

+0

我喜歡這個主意。我將測試這一點,並讓你知道...謝謝@Stefan –

+0

斯特凡我真誠的道歉delay..i將測試此asap..Thanks您的耐心! –

+0

它適合你嗎? – Stefan