首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python模拟异常http.client响应

Python模拟异常http.client响应
EN

Stack Overflow用户
提问于 2019-04-28 16:24:04
回答 2查看 1.3K关注 0票数 2

我正在测试特定的响应代码,并希望在代码不同时模拟出测试用例,比如未经授权的401。我使用的是Python3.7 http.client库和pytest

到目前为止,我尝试使用@patch装饰器并使用side_effect调用一个函数来触发异常

我的测试用例:

代码语言:javascript
复制
from unittest import mock
from application import shorten_url

def mock_status(url):
    raise ConnectionError

@patch("application.shorten_url", side_effect=mock_status)
def test_bitly(client):
    with pytest.raises(ConnectionError) as e:
        shorten_url("something")

我的代码:

代码语言:javascript
复制
def shorten_url(url):
    conn = http.client.HTTPSConnection("api-ssl.bitly.com", timeout=2)
    headers = {
        "Content-Type": "application/json",
        "Authorization": "Bearer abcd",
    }

    payload = json.dumps({"long_url": url})
    conn.request("POST", "/v4/shorten", payload, headers)
    res = conn.getresponse()

    if not res.status == 201:
        raise ConnectionError

    data = json.loads(res.read())
    return data["link"]

我真的不明白如何使用mockside_effect正确地引发这个异常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-28 23:25:32

一个朋友帮我解决了这个问题,这似乎很有效(这对我来说仍然很困惑):

代码语言:javascript
复制
from unittest.mock import patch, MagicMock

@patch("http.client.HTTPSConnection")
@patch("http.client.HTTPResponse")
def test_bitly(mock_conn, mock_res):
    mock_res.status = 400
    mock_conn.getresponse = MagicMock(return_value=mock_res)

    with pytest.raises(ConnectionError):
        shorten_url("fake-url")
票数 2
EN

Stack Overflow用户

发布于 2021-04-27 05:17:26

我认为这个答案更容易理解。首先,我创建了一个假的http连接和响应:

代码语言:javascript
复制
class FakeHTTPConnection:
    def __init__(self, status):
        self.status = status

    def request(self, *args):
        # If you need to do any logic to change what is returned, you can do it in this class
        pass

    def getresponse(self):
        return FakeHTTPResponse(self.status)


class FakeHTTPResponse:
    def __init__(self, status):
        self.status = status

然后在我的测试类中,我重写了http.client.HTTPConnection来创建我的实例。

代码语言:javascript
复制
class TestFoo(unittest.TestCase):

    @patch('http.client.HTTPConnection', new=MagicMock(return_value=FakeHTTPConnection(200)))
    def test_foo_success(self):

        conn = http.client.HTTPConnection("127.0.0.1")
        conn.request("GET", "/endpoint")
        response = conn.getresponse()
        success = response.status == http.HTTPStatus.OK
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55888381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档