使用 HTTPretty 模拟超时的 HTTP 请求
Mock a HTTP request that times out with HTTPretty
像这样使用 HTTPretty library for Python, I can create mock HTTP responses of choice and then pick them up i.e. with the requests library:
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)
输出:<Response [200]>
是否也可以注册一个无法到达的uri(例如连接超时,连接被拒绝,...),这样根本就没有收到任何响应(这与已建立的连接不同给出 HTTP 错误代码,如 404)?
我想在单元测试中使用此行为来确保我的错误处理按预期工作(在 'no connection established' 和 'connection established, bad bad HTTP status code' 的情况下会做不同的事情)。作为一种解决方法,我可以尝试连接到一个无效的服务器,如 http://192.0.2.0
,无论如何都会超时。但是,我更愿意在不使用任何真实网络连接的情况下进行所有单元测试。
同时我明白了,使用 HTTPretty callback body 似乎产生了所需的行为。请参阅下面的内联评论。
这实际上与我正在寻找的不完全相同(它不是无法访问的服务器因此请求超时 而是 一个服务器,一旦到达就抛出超时异常,但是,效果与我的用例相同。
不过,如果有人知道不同的解决方案,我很期待。
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()
像这样使用 HTTPretty library for Python, I can create mock HTTP responses of choice and then pick them up i.e. with the requests library:
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)
输出:<Response [200]>
是否也可以注册一个无法到达的uri(例如连接超时,连接被拒绝,...),这样根本就没有收到任何响应(这与已建立的连接不同给出 HTTP 错误代码,如 404)?
我想在单元测试中使用此行为来确保我的错误处理按预期工作(在 'no connection established' 和 'connection established, bad bad HTTP status code' 的情况下会做不同的事情)。作为一种解决方法,我可以尝试连接到一个无效的服务器,如 http://192.0.2.0
,无论如何都会超时。但是,我更愿意在不使用任何真实网络连接的情况下进行所有单元测试。
同时我明白了,使用 HTTPretty callback body 似乎产生了所需的行为。请参阅下面的内联评论。 这实际上与我正在寻找的不完全相同(它不是无法访问的服务器因此请求超时 而是 一个服务器,一旦到达就抛出超时异常,但是,效果与我的用例相同。
不过,如果有人知道不同的解决方案,我很期待。
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()