HTTP-Client-Mockery für erweiterte Tests
Im Streben nach robusten und zuverlässigen Softwaretests ist das Spotten von HTTP-Clients eine Grundpfeilerpraxis. Dies mit benutzerdefinierten Schnittstellen zu erreichen, kann jedoch eine Herausforderung sein.
Stellen Sie sich das folgende Szenario vor, in dem eine Schnittstelle „HttpClient“ mit einer HTTP-GET-Anfrage unter Verwendung der Basisauthentifizierung verwendet wird:
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 }
Um HTTP zu verspotten und zu simulieren Antworten stehen wir vor einem Dilemma. Bestehende Mock-Bibliotheken wie Gock unterstützen Mocking nur für bestimmte HTTP-Methoden wie GET oder POST.
Benutzerdefinierter Mock-Ansatz
Der Schlüssel zum Mocking dieses HttpClients liegt in der Implementierung seine Schnittstelle mit einer benutzerdefinierten Mock-Struktur. Beispielsweise können wir eine ClientMock-Struktur mit einer passenden Do-Methode definieren:
type ClientMock struct { } func (c *ClientMock) Do(req *http.Request) (*http.Response, error) { // Simulate HTTP response with custom logic return &http.Response{}, nil }
Mock einbinden
Wenn diese Mock-Struktur vorhanden ist, können wir sie injizieren in die GetOverview-Funktion. Hier ist ein Beispiel:
mock := ClientMock{} overview, err := GetOverview(&mock, &overview)
Durch die Verwendung des ClientMock können wir die simulierte HTTP-Antwort steuern und so umfassende Unit-Tests ermöglichen, ohne auf externe HTTP-Server oder -Dienste angewiesen zu sein.
Das obige ist der detaillierte Inhalt vonWie kann ich HTTP-Clients für erweiterte Go-Tests effektiv simulieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!