第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為超時(shí)的單元測試創(chuàng)??建 deadlineExceededError:true

為超時(shí)的單元測試創(chuàng)??建 deadlineExceededError:true

Go
慕村225694 2023-03-15 15:23:58
我正在嘗試在我的項(xiàng)目中創(chuàng)建一個(gè)單元測試,我在其中模擬 http 客戶端并設(shè)置客戶端必須返回的響應(yīng)。我需要這樣的行為,因?yàn)槿绻?http 客戶端因超時(shí)而失敗,我的代碼需要相應(yīng)的行為:因此我需要模擬 http 客戶端以返回 deadlineExceededError 并對(duì)其進(jìn)行單元測試。到目前為止我嘗試的是以client.Do返回的方式模擬客戶端 Do 函數(shù):GetDoFunc = func(*http.Request) (*http.Response, error) {    return nil, &url.Error{        Op:  "Post",        Err: context.DeadlineExceeded,    }}它有效但不完全,這意味著當(dāng)我以這種模擬行為執(zhí)行代碼時(shí),返回的錯(cuò)誤類型是:error(*net/url.Error) *{Op: "Post", URL: "", Err: error(context.deadlineExceededError) {}}這又是正確的,但不完全正確。為什么?因?yàn)槿绻疫\(yùn)行代碼并且發(fā)生真正的超時(shí),我會(huì)得到更完整的東西: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。如果我設(shè)法告訴我的模擬返回它,我可以斷言,我發(fā)現(xiàn)它比僅斷言返回的錯(cuò)誤是deadlineExceededError類型更完整。
查看完整描述

1 回答

?
繁星淼淼

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊

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


type timeoutError struct {

    err     string

    timeout bool

}


func (e *timeoutError) Error() string {

    return e.err

}


func (e *timeoutError) Timeout() bool {

    return e.timeout

}

這樣,timeoutError同時(shí)實(shí)現(xiàn)了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,

    }

}

這只是返回上面定義的錯(cuò)誤并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())

}

如果您調(diào)試此測試并在變量上使用調(diào)試器暫停err,您將看到想要的結(jié)果。

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


查看完整回答
反對(duì) 回復(fù) 2023-03-15
  • 1 回答
  • 0 關(guān)注
  • 129 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)