it-swarm.com.de

So verspotten Sie http.Client Do-Methode

Ich versuche, eine Lösung zu finden, um Test zu schreiben und HTTP-Antwort zu verspotten. In meiner Funktion, in der ich die Schnittstelle akzeptiere:

type HttpClient interface {
    Do(req *http.Request) (*http.Response, error)
}

Ich mache http Anfrage mit Basisauthentifizierung

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)

Wie kann ich diesen HttpClient verspotten? Ich suche nach einer Scheinbibliothek, zum Beispiel: https://github.com/h2non/gock aber es gibt nur Schein für Get and Post

Vielleicht sollte ich es anders machen. Ich bin für Ratschläge dankbar

24
quentino

Jede Struktur mit einer Methode, die der Signatur in Ihrer Schnittstelle entspricht, implementiert die Schnittstelle. Beispielsweise könnten Sie eine Struktur ClientMock erstellen.

type ClientMock struct {
}

mit der Methode

func (c *ClientMock) Do(req *http.Request) (*http.Response, error) {
    return &http.Response{}, nil
}

Sie können diese ClientMock -Struktur dann in Ihre GetOverview -Funktion einfügen. hier ist ein Beispiel für den Go-Spielplatz.

25
Gavin

Das net/http/httptest Paket ist dein bester Freund:

// generate a test server so we can capture and inspect the request
testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
    res.WriteHeader(scenario.expectedRespStatus)
    res.Write([]byte("body"))
}))
defer func() { testServer.Close() }()

req, err := http.NewRequest(http.MethodGet, testServer.URL, nil)
assert.NoError(t, err)

res, err := http.DefaultClient.Do(req)
assert.NoError(t, err)
assert.Equal(t, scenario.expectedRespStatus, res.StatusCode, "status code should match the expected response")
15
rocketspacer

Ich weiß, dass es eine Weile her ist, aber ich habe kürzlich etwas geschrieben, das dabei helfen soll.

Im Allgemeinen empfehle ich, einen echten HTTP-Server lokal zu starten, um HTTP-Anfragen zu verspotten, da dies in Go einfach ist. https://golang.org/pkg/net/http/httptest/ ist ein ziemlich standardmäßiger Weg, dies zu tun (siehe den Beispielcode unter dem Servertyp).

Nachdem ich jedoch viele HTTP-Verspottungen durchgeführt hatte, wollte ich etwas, das ein wenig mehr kann, als eine gute Verspottungsbibliothek: einfache Einstellung der Erwartungen, Überprüfung, dass alle Anforderungen gestellt wurden usw. Ich habe im Allgemeinen https: // godoc.org/github.com/stretchr/testify/mock für das Verspotten und die gewünschten Funktionen.

Also schrieb ich https://github.com/dankinder/httpmock , das im Grunde beide kombiniert.

3
Dan

Sie müssen eine Struktur mit Methoden erstellen, die der Schnittstelle entsprechen. Mocks werden häufig zu Testzwecken verwendet, daher möchten die Benutzer die Möglichkeit haben, Rückgabewerte von Mock-Methoden zu erstellen. Um dies zu erreichen, erstellen wir eine Struktur mit Funkattributen , die den Methoden entsprechen.

Als Ihre Schnittstelle ist:

type HttpClient interface {
    Do(req *http.Request) (*http.Response, error)
}

Äquivalenter Schein:

type MockClient struct {
    DoFunc func(req *http.Request) (*http.Response, error)
}

func (m *MockClient) Do(req *http.Request) (*http.Response, error) {
    if m.DoFunc != nil {
        return m.DoFunc(req)
    }
    return &http.Response{}, nil
}

Der nächste Schritt besteht darin, einige Tests zu schreiben. Beispiel hier .

2
mwarzynski