2017-02-26 8 views
5

私はgotestsとgorilla muxを使用し、私はhttp handlefuncハンドラをテストすることができますが、ゴリラマルチプレクサの下で適切なHTTPリクエストメソッドに応答しません。どのように私はテストの "ライブサーバー"のバージョンを行うことができますか?ここゴーランhttpサーバをテストするには?

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) 
     }) 
    } 
} 

問題は、関数がGETとPOSTリクエストと doens'tの両方を考慮に私のメインのルータを取るに応答することです。これは関数のユニットテストのためには問題ありませんが、 というものですが、 というものをテストして、一気にすべてのものを取り除くという統合テストを書く方が良いと思います。

答えて

8

net/http/httptest.Serverタイプを使用して、ライブサーバーでテストします。

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. 
    }) 
    } 
} 

質問はゴリラのマルチプレクサを使用していますが、この答えではアプローチと詳細がhttp.Handlerインタフェースを満たす任意のルータに適用されます。

関連する問題