2016-06-28 79 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