使用Python unittest模拟side_effect

时间:2016-06-28 10:15:44

标签: python unit-testing mocking

我正在尝试模拟我的请求。要获得状态代码200并使history[0].status_code触发IndexError(因为没有重定向)。我可以让status_code返回200,但是当我嘲笑具有所需副作用的历史记录时,IndexError不会被触发。

@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)

1 个答案:

答案 0 :(得分:1)

好的,我检查了代码,我想提一些事情。

首先,assertRises方法接收callable作为第二个参数;) 它的定义看起来像这样

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

第二件事,如果你使用

嘲笑status_code
mock_requests.return_value.status_code = 200

为什么不尝试历史记录:

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)