2017-02-26 50 views
5

我使用gotests和大猩猩多路复用器,我可以单元测试我的http handlefunc处理程序,但它们不响应正确的http请求方法,因为它们应该在大猩猩多路复用器下。我如何做一个“活服务器”版本的测试?golang如何生活测试一个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请求和 好好尝试都考虑到我的主路由器。这对于单元测试功能很好, ,但我认为只写一个集成测试来测试整个 事情并且一气呵成地完成一切工作会更好。

回答

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

虽然问题采用大猩猩MUX的方法,并在这个答案细节应用于满足http.Handler接口的路由器。