2015-12-29 69 views
1

如何測試ioutil.ReadAll(rep.Body)的錯誤?我是否需要將我的函數分成兩部分,一部分會發出請求,另一部分會讀取主體並返回字節和錯誤?將功能分爲2個功能用於測試覆蓋

func fetchUrl(URL string) ([]bytes, error) { 
    resp, err := http.Get(URL) 
    if err != nil { 
    return nil, err 
    } 
    body, err := ioutil.ReadAll(resp.Body) 
    resp.Body.Close() 
    if err != nil { 
    return nil, err 
    } 
    return body, nil 
} 

回答

2

我是否需要將我的函數分成兩部分,一部分會發出請求,另一部分會讀取主體並返回字節和錯誤?

第一個被稱爲http.Get,另一個ioutil.ReadAll,所以我不認爲有什麼分裂。你剛剛創建了一個函數,它使用了兩個其他函數,你應該假設它們工作正常。如果你想測試什麼是使用http.Getioutil.ReadAll在一起你fetchURL功能

func fetchURL(URL string) ([]byte, error) { 
    resp, err := http.Get(URL) 
    if err != nil { 
     return nil, err 
    } 
    defer resp.Body.Close() 
    return ioutil.ReadAll(resp.Body) 
} 

:你甚至可以簡化你的功能,使之更加明顯。我不打算直接測試它,但如果你堅持這樣做,你可以覆蓋http.DefaultTransport進行一次測試,並提供你自己的,它返回http.Response身體執行一些錯誤情況(例如和身體閱讀過程中的錯誤)。

這裏是素描的想法:

type BrokenTransport struct { 
} 

func (*BrokenTransport) RoundTrip(*http.Request) (*http.Response, error) { 
    // Return Response with Body implementing specific error behaviour 
} 

http.DefaultTransport = &BrokenTransport{} 

// http.Get will now use your RoundTripper. 
// You should probably restore http.DefaultTransport after the test. 
2

基本上是的,除非你使用net/http/httptest或類似的方式來模擬你的HTTP服務器時測試。

但問題是:你真的會測試什麼?那ioutil.ReadAll()檢測到錯誤?但我確定這已經被Go的stdlib的測試套件覆蓋了。

因此,我想說,在這種特殊情況下,您即將測試測試的緣故。國際海事組織對於這種微不足道的情況,最好專注於如何進一步處理提取的結果。