一尘不染

如何使用httprouter编写测试

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

控制器

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

我的问题是:当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")
  }
}

问题是,httprouter不是处理程序,也不是handlefunc。所以我现在被困住了


阅读 221

收藏
2020-07-02

共1个答案

一尘不染

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

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")
    }
}
2020-07-02