Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python unittesting request.get使用模拟,不引发特定异常_Python_Unit Testing - Fatal编程技术网

Python unittesting request.get使用模拟,不引发特定异常

Python unittesting request.get使用模拟,不引发特定异常,python,unit-testing,Python,Unit Testing,我有一个向API发送get请求的简单函数,我希望能够编写一个单元测试来断言scriprt打印错误,然后在请求返回异常时退出 def fetch_members(self): try: r = requests.get(api_url, auth=('user', api_key)) except requests.exceptions.HTTPError as error: print(error) sys.exit(1) 我尝试

我有一个向API发送get请求的简单函数,我希望能够编写一个单元测试来断言scriprt打印错误,然后在请求返回异常时退出

def fetch_members(self):
    try:
        r = requests.get(api_url, auth=('user', api_key))
    except requests.exceptions.HTTPError as error:
        print(error)
        sys.exit(1)
我尝试过以下测试,但HTTPError从未引发

import requests
from unittest.mock import patch

@patch('sys.exit')
@patch('sys.stdout', new_callable=StringIO)
@patch('requests.get')
def test_fetch_members_with_bad_request(self, mock_get, mock_stdout,
                                        mock_exit):
    response = requests.Response()
    response.status_code = 400  # Bad reqeust
    mock_get.return_value = response
    mock_get.side_effect = requests.exceptions.HTTPError
    with self.assertRaises(requests.exceptions.HTTPError):
        fetch_members()
        mock_exit.assert_called_once_with(1)
        self.assertIsNotNone(mock_stdout.getvalue())

如何正确地修补请求。是否总是引发某种错误?

您的函数捕获并处理异常:

except requests.exceptions.HTTPError as error:
这意味着它将永远不会进一步传播,因此您的
assertRaises()
将失败。只要断言调用了
sys.exit()
,就足够了

设置返回值也没有意义;该调用将引发一个异常。以下内容应足够:

@patch('sys.exit')
@patch('sys.stdout', new_callable=StringIO)
@patch('requests.get')
def test_fetch_members_with_bad_request(self, mock_get, mock_stdout,
                                        mock_exit):
    mock_get.side_effect = requests.exceptions.HTTPError
    fetch_members()
    mock_exit.assert_called_once_with(1)
    self.assertIsNotNone(mock_stdout.getvalue())
您的示例代码确实会引发异常,但您的函数会捕获并处理它。