2017-02-26 16 views
5

Ben, el ve gorilla mux kullanıyorum ve http handlefunc işleyicileri test edebilirim ama gorilla mux altında olması gerektiği gibi uygun http istek yöntemlerine yanıt vermiyorlar. Testin "canlı sunucu" sürümünü nasıl yapabilirim? Buradagolang Nasıl bir http sunucusunu test etmeli?

func main() { 
    router := mux.NewRouter() 
    router.HandleFunc("/", views.Index).Methods("GET") 
} 

func Index(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Type", "application/json; charset=UTF-8") 
    w.WriteHeader(http.StatusOK) 

    fmt.Fprintf(w, "INDEX\n") 
} 

func TestIndex(t *testing.T) { 

    req, _ := http.NewRequest("GET", "/", nil) 
    req1, _ := http.NewRequest("POST", "/", nil) 
    rr := httptest.NewRecorder() 

    handler := http.HandlerFunc(Index) 

    type args struct { 
     w http.ResponseWriter 
     r *http.Request 
    } 
    tests := []struct { 
     name string 
     args args 
    }{ 
     {name: "1: testing get", args: args{w: rr, r: req}}, 
     {name: "2: testing post", args: args{w: rr, r: req1}}, 
    } 
    for _, tt := range tests { 
     t.Run(tt.name, func(t *testing.T) { 
      handler.ServeHTTP(tt.args.w, tt.args.r) 
      log.Println(tt.args.w) 
     }) 
    } 
} 

sorun function get ve post talepleri ve doens't hem hesaba benim ana yönlendirici almak tepki vermesidir. Bu işlev, işlevini test etmek için iyi bir şeydir, ancak bence tüm şeylerini test eden ve tek seferde her şeyi yoluna çıkaran entegre bir test yazmak daha iyi olur.

cevap

8

Canlı bir sunucuyla sınamak için net/http/httptest.Server türünü kullanın.

func TestIndex(t *testing.T) { 
    // Create server using the a router initialized elsewhere. The router 
    // can be a Gorilla mux as in the question, a net/http ServeMux, 
    // http.DefaultServeMux or any value that statisfies the net/http 
    // Handler interface. 
    ts := httptest.NewServer(router) 
    defer ts.Close() 

    newreq := func(method, url string, body io.Reader) *http.Request { 
    r, err := http.NewRequest(method, url, body) 
    if err != nil { 
     t.Fatal(err) 
    } 
    return r 
    } 

    tests := []struct { 
    name string 
    r *http.Request 
    }{ 
    {name: "1: testing get", r: newreq("GET", ts.URL+"/", nil)}, 
    {name: "2: testing post", r: newreq("POST", ts.URL+"/", nil)}, // reader argument required for POST 
    } 
    for _, tt := range tests { 
    t.Run(tt.name, func(t *testing.T) { 
     resp, err := http.DefaultClient.Do(tt.r) 
     defer resp.Body.Close() 
     if err != nil { 
      t.Fatal(err) 
     } 
     // check for expected response here. 
    }) 
    } 
} 

soru Gorilla mux, yaklaşım ve bu yanıtında ayrıntıları kullansa da

http.Handler arayüzünü karşılayan herhangi yönlendirici için geçerlidir.