如何在python单元测试中模拟连接错误并请求超时

 忧伤丿稻草展 发布于 2023-02-07 07:14

假设我的django/flask应用程序从API中提取信息,我如何测试连接异常是否被捕获并正确处理?

例如,这里有一个调用API的函数:

import requests
def call_the_api():
    url = 'http://httpbin.org/get'
    try:
        req = requests.get(url)
        if req.json().get('errors'):
            logger.warn("API error response")
            return {'request_error': 'api_error_response'}
    except requests.exceptions.ConnectionError:
        logger.warn('ConnectionError')
        return {'request_error': 'ConnectionTimeout'}
    except requests.exception.Timeout:
        logger.warn('API request timed out')
        return {'request_error': 'Timeout'}
    except Exception, ex:
        logger.warn("API request Exception: %s", ex)
        return {'request_error': ex}
    else:
        return req.json()

为了测试来自API的响应,我发现mock非常有用.

def mock_get_request():
    response = requests.get.return_value
    json_file = 'sample_response.json'
    json_file_path = os.path.join(os.path.dirname(__file__), json_file)
    with open(json_file_path, 'r') as f:
        response.content = response.text = f.read()
    response.status_code = 200
    response.encoding = 'utf-8'
    response.json = lambda: json.loads(response.content.decode(response.encoding))
    response.url = u'%s' % args[0]
    return response

class TestSuitabilityFunctions(TestCase):
    def test_call_the_api(self):
        requests.get = MagicMock(side_effect=mock_get_request)
        resp = call_the_api()
        self.assertEqual(resp.get('url'), "http://httpbin.org/get")

所以我的问题是如何模拟连接超时或错误?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有