簡體   English   中英

模擬使用HTTPretty超時的HTTP請求

[英]Mock a HTTP request that times out with 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)

輸出: <Response [200]>

是否有可能注冊無法訪問的uri(例如連接超時,連接被拒絕,......),以便根本不接收任何響應(這與提供HTTP錯誤代碼的已建立連接不同像404)?

我希望在單元測試中使用此行為,以確保我的錯誤處理按預期工作(在“未建立連接”和“建立連接,錯誤的HTTP狀態代碼”的情況下,它會執行不同的操作)。 作為一種解決方法,我可以嘗試連接到像http://192.0.2.0這樣的無效服務器,無論如何都會超時。 但是,我更願意在不使用任何真實網絡連接的情況下進行所有單元測試。

同時我得到了它,使用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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM