模拟使用HTTPretty超时的HTTP请求

Dir*_*irk 7 python unit-testing python-requests httpretty

使用HTTP 的HTTPretty库,我可以创建选择的模拟HTTP响应,然后选择它们,即使用请求库,如下所示:

import httpretty
import requests

# set up a mock
httpretty.enable()
httpretty.register_uri(
            method=httpretty.GET,
            uri='http://www.fakeurl.com',
            status=200,
            body='My Response Body'
        )

response = requests.get('http://www.fakeurl.com')

# clean up
httpretty.disable()
httpretty.reset()

print(response)
Run Code Online (Sandbox Code Playgroud)

日期: <Response [200]>

是否有可能注册无法访问的uri(例如连接超时,连接被拒绝,......),以便根本不接收任何响应(这与提供HTTP错误代码的已建立连接不同像404)?

我希望在单元测试中使用此行为,以确保我的错误处理按预期工作(在"未建立连接"和"建立连接,错误的HTTP状态代码"的情况下,它会执行不同的操作).作为一种解决方法,我可以尝试连接到无效的服务器http://192.0.2.0,在任何情况下都会超时.但是,我更愿意在不使用任何真实网络连接的情况下进行所有单元测试.

Dir*_*irk 7

同时我得到了它,使用HTTPretty回调体似乎产生了所需的行为.请参阅下面的内联评论.这实际上与我正在寻找的不完全相同(它不是一个 无法访问的服务器,因此请求超时但是 一旦到达就抛出超时异常的服务器,但是,效果对我而言是相同的用例.

不过,如果有人知道不同的解决方案,我很期待.

import httpretty
import requests

# enable HTTPretty
httpretty.enable()

# create a callback body that raises an exception when opened
def exceptionCallback(request, uri, headers):

    # raise your favourite exception here, e.g. requests.ConnectionError or requests.Timeout
    raise requests.Timeout('Connection timed out.')

# set up a mock and use the callback function as response's body
httpretty.register_uri(
            method=httpretty.GET,
            uri='http://www.fakeurl.com',
            status=200,
            body=exceptionCallback
        )

# try to get a response from the mock server and catch the exception
try:
    response = requests.get('http://www.fakeurl.com')
except requests.Timeout as e:

    print('requests.Timeout exception got caught...')
    print(e)

    # do whatever...

# clean up
httpretty.disable()
httpretty.reset()
Run Code Online (Sandbox Code Playgroud)

  • 正如您所注意到的,这并没有真正测试运行时行为,因为没有给定“timeout”参数的“requests.get”[无限期挂起](https://docs.python-requests.org/en/master/user/quickstart /#timeouts)即使这么多年之后,在 `requests` 2.25.1 中也是如此。这可以测试代码如果超时会做什么,但根本不会测试它是否会超时。 (2认同)