如何用httprouter编写测试

JSN*_*oob 4 go

我正在为GoLang中的简单REST服务编写测试.但是,因为我使用julienschmidt/httprouter作为路由库.我正在努力学习如何编写测试.

main.go

package main

func main() {
   router := httprouter.New()
   bookController := controllers.NewBookController()
   router.GET("/book/:id", bookController.GetBook)
   http.ListenAndServe(":8080", router)
}
Run Code Online (Sandbox Code Playgroud)

控制器

package controllers

type BookController struct {}

func NewBookController *BookController {
   return &BookController()
}

func (bc BookController) GetBook(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
   fmt.Fprintf(w,"%s", p)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何测试这个,而GetBook既不是HttpHandler也不是HttpHandle

如果我使用传统的处理程序,测试将很容易

func TestGetBook(t *testing.T) {
  req, _ := http.NewRequest("GET", "/book/sampleid", nil)
  rr := httptest.NewRecorder()
  handler := controllers.NewBookController().GetBook
  handler.ServeHTTP(rr,req)
  if status := rr.code; status != http.StatusOK {
    t.Errorf("Wrong status")
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,httprouter不是handler或handlefunc.所以我现在被困住了

mko*_*iva 7

只需为每个测试启动一个新路由器然后注册测试中的处理程序,然后将测试请求传递给路由器,而不是处理程序,以便路由器可以解析路径参数并将它们传递给处理程序.

func TestGetBook(t *testing.T) {
    handler := controllers.NewBookController()
    router := httprouter.New()
    router.GET("/book/:id", handler.GetBook)

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

    router.ServeHTTP(rr, req)
    if status := rr.Code; status != http.StatusOK {
        t.Errorf("Wrong status")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 小更新:`rr.code` - >`rr.Code`(参见[httptest.ResponseRecorder docs](https://golang.org/pkg/net/http/httptest/#ResponseRecorder)). (3认同)
  • 如果您想用许多不同的请求测试单个处理程序,请查看[表驱动测试](https://github.com/golang/go/wiki/TableDrivenTests)。 (2认同)