2017-10-26 1 views
0

Für SatzWie injiziere ich eine URL zu httptest.server in Golang?

resp, err := client.Get(fmt.Sprintf("https://www.xxxxx/day?time=%s", time)) 

Wenn ich eine Antwort auf diese client.Get() in Unit-Test verspotten wollen, sollte ich httptest.server verwenden, aber wie kann ich die URL (https://www.xxxxx/day?time=%s) an die URL binden von httptest.server? Wenn ich also client.Get() aufruft, kann ich die zuvor eingestellte Antwort zurückgeben. Aus irgendeinem Grund kann ich hier keinen Kunden verspotten.

+1

Es wäre hilfreich, Ihren Code zu posten, damit wir sehen können, was Sie erreichen möchten. – Dale

Antwort

0

Der http.Client ist eine Struktur, keine Schnittstelle, die das Mocking erschwert, wie Sie gesehen haben. Eine andere Möglichkeit, es zu verspotten, ist das Übergeben der externen Abhängigkeiten, die eine Routine benötigt. Anstatt also client.Get direkt zu verwenden, verwenden Sie clientGet - was ein Funktionszeiger ist, der an die Routine übergeben wurde.

Von der Unit-Test können Sie dann erstellen:

mockClientGet(c *http.client, url string) (resp *http.Response, err error) { 
// add the test code to return what you want it to. 
} 

Dann in Ihrem Haupt-Code verwenden:

resp, err := clientGet(client, fmt.Sprintf("https://www.xxxxx/day?time=%s", time)) 

Wenn normalerweise die Prozedur aufrufen, verwenden Sie den Funktionszeiger auf http.Client.Get , und für Ihren Test übergeben Sie einen Zeiger auf Ihren Schein. Es ist nicht ideal, aber ich habe keine schönere Art gesehen, fremde externe Anrufe zu verspotten - und angesichts seiner externen Abhängigkeit ist es keine schlechte Sache, sie von außen zu injizieren.

0

Sie nicht, normalerweise. Sie nehmen die Basis-URL vom Server und geben sie an den Client:

package main 

import (
    "fmt" 
    "net/http" 
    "net/http/httptest" 
    "testing" 
    "time" 
) 

func TestClient(t *testing.T) { 
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
      // Verify request, send mock response, etc. 
    })) 

    defer server.Close() 

    var client *http.Client 
    var time time.Time 

    baseURL := server.URL // Something like "http://127.0.0.1:53791" 
    resp, err := client.Get(fmt.Sprintf(baseURL+"/day?time=%s", time)) 
    if err != nil { 
      t.Fatal(err) 
    } 

    // Verify response body if applicable 

    resp.Body.Close() 
} 
Verwandte Themen