2012-01-21 30 views
2

我使用Python 2.6.5用模擬0.7.2,並有在那裏我使用補丁裝飾的一類單元測試。初始化參數與修補程序和模擬用的urllib2

@patch('urllib2.Request') 
def test_do_my_call(self, MockClass): 

    """will test that _do_my_call is getting called with correct values""" 

    instance = MockClass.return_value 
    mock_urlopen = Mock() 
    mock_urlopen.return_value = 'foo' 
    urllib2.urlopen = mock_urlopen 

    response = do_something('MyData') 

    self.assertEqual(mock_urlopen.call_count, 1) 
    self.assertEqual(response, 'foo') 

上面的代碼通過,它驗證urlopen至少被調用,但它仍然有點弱。

的「do_something」方法創建新的請求(因此需要補丁),然後用它調用的urlopen(和如上述我注意到驗證它被調用)。但是,我想知道是否有方法來測試從「do_something」中傳遞給urllib2.Request()的參數。例如,do_something是否傳遞了正確的/期望的url和正確的/期望的頭文件?

這可能嗎?

回答

1

雖然我grncdr同意,如果你的類有副作用,這裏是你如何能做到這一點:

from mock import Mock, patch 

class MyClass(object): 
    def __init__(self, a, b, c): 
     pass 

def method_to_test(): 
    m = MyClass(1, 'test', {'key' : 'value'}) 

@patch('__main__.MyClass') 
def test_my_method(mock_class): 
    method_to_test() 
    mock_class.assert_called_with(1, 'test', {'key': 'value'}) 

test_my_method() 
+0

是的... grncdr是一個很好的觀點。但是,我選擇這個作爲答案,因爲它可能有助於某人。我做錯了什麼是試圖測試「實例」。應該一直在「MockClass」上做。謝謝! –

3

,因爲建立一個Request實例沒有你不應該嘲笑urllib2.Request,而是檢測得到數據傳遞給你的嘲笑urlopen,以驗證它是否具有正確的狀態真正Request例如副作用。

+0

很好,很難與:)給予好評的是正確的爭論,但我要去將Eric Fortin的答案標記爲「正確」 - 以防萬一它可能有助於某人在未來找到答案。 –