2017-07-21 3 views
0

Wie kann ich func main testen? Gefällt mir:Wie testen Hauptfunktion in Gin-Anwendung?

func main(){ 
    Engine := GetEngine() // returns gin router with handlers atttached 
    Engine.Run(":8080") 
} 

Es hat nur 2 Zeilen, aber ich möchte sie abgedeckt haben. TestMain' ist für die Testvorbereitung reserviert, bedeutet das, dass main nicht von Sprachentwicklern geplant wurde? Ich kann den Inhalt auf eine andere Funktion mainReal verschieben, aber es scheint etwas über Engineering zu sein?

Wie testen Gin hat gut begonnen? Kann ich main in separaten goroutine starten, überprüfen Sie die Antwort und stoppen Sie es?

Danke.

P.S. Mögliches Duplikat ist kein genaues Duplikat, da es sich nicht um das Testen von Func main() selbst handelt, sondern eher um Ideen, sich nach draußen zu bewegen und so verschiedene Probleme und Ansätze zu enthalten.

+0

Mögliches Duplikat [? Wie die Haupt-Paket Funktionen in golang testen] (https://stackoverflow.com/questions/31352239/how-to-test-the-main-package -funktionen-in-golang) – Nebril

+0

Ich habe diesen Beitrag gesehen, aber es ist nicht das Gleiche, es gibt verschiedene Aspekte. –

Antwort

0

Lösung.

Sie können die Funktion main() aus dem Paket main auf die gleiche Weise testen, einfach nicht TestMain nennen. Ich starte es als separate Goroutine, versuche dann, eine Verbindung herzustellen und jede Anfrage auszuführen.

Ich beschloss, eine Verbindung zu Auxiliary-Handler, die mit einem einfachen JSON antworten sollte {"status": "ok"}. In meinem Fall:

func TestMainExecution(t *testing.T) { 
    go main() 
    resp, err := http.Get("http://127.0.0.1:8080/checkHealth") 
    if err != nil { 
      t.Fatalf("Cannot make get: %v\n", err) 
    } 
    bodySb, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
      t.Fatalf("Error reading body: %v\n", err) 
    } 
    body := string(bodySb) 
    fmt.Printf("Body: %v\n", body) 
    var decodedResponse interface{} 
    err = json.Unmarshal(bodySb, &decodedResponse) 
    if err != nil { 
      t.Fatalf("Cannot decode response <%p> from server. Err: %v", bodySb, err) 
    } 
    assert.Equal(t, map[string]interface{}{"status": "ok"}, decodedResponse, 
      "Should return status:ok") 
} 
Verwandte Themen