用於進階測試的HTTP 用戶端模擬
為了追求健壯可靠的軟體測試,模擬HTTP 用戶端是一種基石。然而,使用自訂介面實現這一點可能具有挑戰性。
考慮以下場景,其中介面 HttpClient 與使用基本驗證的 HTTP GET 請求一起使用:
func GetOverview(client HttpClient, overview *Overview) (*Overview, error) { request, err := http.NewRequest("GET", fmt.Sprintf("%s:%s/api/overview", overview.Config.Url, overview.Config.Port), nil) if (err != nil) { log.Println(err) } request.SetBasicAuth(overview.Config.User, overview.Config.Password) resp, err := client.Do(request) if (err != nil) { return nil, err } if resp.StatusCode != 200 { return nil, fmt.Errorf("Bad StatusCode: %v", resp.StatusCode) } return overview, nil }
模擬和模擬 HTTP的回應,我們面臨兩難的境地。現有的模擬庫,例如gock,僅支援特定HTTP方法(如GET或POST)的模擬。
自訂模擬方法
模擬此HttpClient的關鍵是實作它與自訂 Mock 結構的介面。例如,我們可以定義一個有匹配Do 方法的ClientMock 結構體:
type ClientMock struct { } func (c *ClientMock) Do(req *http.Request) (*http.Response, error) { // Simulate HTTP response with custom logic return &http.Response{}, nil }
合併Mock
有了這個Mock 結構體,我們就可以注入它進入GetOverview 函數。以下是一個範例:
mock := ClientMock{} overview, err := GetOverview(&mock, &overview)
透過使用 ClientMock,我們可以控制模擬的 HTTP 回應,從而無需依賴外部 HTTP 伺服器或服務即可進行全面的單元測試。
以上是如何有效模擬 HTTP 用戶端以進行高級 Go 測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!