亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為超時的單元測試創??建 deadlineExceededError:true

為超時的單元測試創??建 deadlineExceededError:true

Go
慕村225694 2023-03-15 15:23:58
我正在嘗試在我的項目中創建一個單元測試,我在其中模擬 http 客戶端并設置客戶端必須返回的響應。我需要這樣的行為,因為如果 http 客戶端因超時而失敗,我的代碼需要相應的行為:因此我需要模擬 http 客戶端以返回 deadlineExceededError 并對其進行單元測試。到目前為止我嘗試的是以client.Do返回的方式模擬客戶端 Do 函數:GetDoFunc = func(*http.Request) (*http.Response, error) {    return nil, &url.Error{        Op:  "Post",        Err: context.DeadlineExceeded,    }}它有效但不完全,這意味著當我以這種模擬行為執行代碼時,返回的錯誤類型是:error(*net/url.Error) *{Op: "Post", URL: "", Err: error(context.deadlineExceededError) {}}這又是正確的,但不完全正確。為什么?因為如果我運行代碼并且發生真正的超時,我會得到更完整的東西:error(*net/url.Error) *{Op: "Post", URL: "http://localhost:4500/scan/", Err: error(*net/http.httpError) *{err: "context deadline exceeded (Client.Timeout exceeded while awaiting headers)", timeout: true}}我最感興趣的是timeout: true。如果我設法告訴我的模擬返回它,我可以斷言,我發現它比僅斷言返回的錯誤是deadlineExceededError類型更完整。
查看完整描述

1 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

為了不讓測試過于復雜,我建議您采用這種方法。首先,首先定義您的錯誤:


type timeoutError struct {

    err     string

    timeout bool

}


func (e *timeoutError) Error() string {

    return e.err

}


func (e *timeoutError) Timeout() bool {

    return e.timeout

}

這樣,timeoutError同時實現了Error()和Timeout接口。

然后你必須為 HTTP 客戶端定義模擬:


type mockClient struct{}


func (m *mockClient) Do(req *http.Request) (*http.Response, error) {

    return nil, &timeoutError{

        err:     "context deadline exceeded (Client.Timeout exceeded while awaiting headers)",

        timeout: true,

    }

}

這只是返回上面定義的錯誤并nil作為 http.Response。最后,讓我們看看如何編寫示例單元測試:


func TestSlowServer(t *testing.T) {

    r := httptest.NewRequest(http.MethodGet, "http://example.com", nil)

    client := &mockClient{}


    _, err := client.Do(r)


    fmt.Println(err.Error())

}

如果您調試此測試并在變量上使用調試器暫停err,您將看到想要的結果。

由于這種方法,您可以在不增加任何額外復雜性的情況下實現所需的功能。讓我知道是否適合你!


查看完整回答
反對 回復 2023-03-15
  • 1 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號