2016-06-28 111 views
0

我試圖嘲笑我的requests.get有一個狀態代碼200和使history[0].status_code觸發IndexError(因爲沒有重定向)。我能夠得到status_code返回200,但是當我用期望的副作用剔除歷史記錄時,IndexError未被觸發。用Python單元測試嘲弄side_effect

@patch('requests.get') 
def test_no_redirect(self, mock_requests): 
    mock_requests.return_value.status_code = 200 
    mock_requests.history[0].status_code.side_effect = IndexError() 

    response = requests.get('example.com') 

    self.assertRaises(IndexError, response.history[0].status_code)    
    self.assertTrue(200, response.status_code) 
+0

你確定,你應該指定''IndexError()''來''''status_code''的side_effect''? Mayby調用''history [0]''應該拋出錯誤? – Kamil

+0

@Kamil謝謝你的建議,但我已經嘗試過,並沒有引發異常。 – Cephlin

回答

1

好的,我檢查了代碼,我想提幾件事情。

所有assertRises方法首先接收調用作爲第二個參數;) 它的定義是這樣的

def assertRaises(self, excClass, callableObj=None, *args, **kwargs): 

第二件事,如果你正在使用

mock_requests.return_value.status_code = 200 

,爲什麼不嘲笑status_code嘗試與歷史相同:

mock_requests.return_value.history = [] 

我們使用真正的列表而不是某種模擬,所以我認爲它更好。 測試方法看起來是這樣的:

@patch('requests.get') 
def test_no_redirect(self, mock_requests): 
    mock_requests.return_value.status_code = 200 
    mock_requests.return_value.history = [] 

    mock_requests.history[0].status_code.side_effect = IndexError 

    response = requests.get('example.com') 

    self.assertRaises(IndexError, lambda: response.history[0]) 
    self.assertTrue(200, response.status_code) 
+0

所以除了asserRaises沒有調用callable之外,我唯一的錯誤是在設置IndexError之前沒有設置歷史記錄,那麼對嗎? – Cephlin

+1

它似乎是這樣:)更重要的是,你可以通過調用''mock_requests.return_value.history .__ getitem __。side_effect = IndexError''而不是''mock_requests.return_value.history = []''來實現相同的結果,但是使用簡單的列表是從我的角度來看,它更具可讀性。簡單的代碼幾乎總是更好。 – Kamil