我正在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。所以我现在被困住了
只需为每个测试启动一个新路由器,然后注册要测试的处理程序,然后将测试请求传递给路由器(而不是处理程序),以便路由器可以解析路径参数并将它们传递给处理程序。
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") } }