当我使用 http.NewRequest 进行测试时,为什么我的请求 URL 解析不正确?

当我使用 curl 测试我的 /health/ 端点时,一切都按预期工作: curl  localhost:8080/health/my_id返回my_id.


但是当我运行我的测试时,处理程序无法从参数中提取 ID。我应该如何从测试中制作我的查询来实现这一点?


健康测试


 12 func TestHealth(t *testing.T) {

 13

 14         // Initialize a new httptest.ResponseRecorder.

 15         rr := httptest.NewRecorder()

 16

 17         // Initialize a new dummy http.Request.

 18         r, err := http.NewRequest(http.MethodGet, "/health/my_id", nil)

 19         if err != nil {

 20                 t.Fatal(err)

 21         }

 22

 23         // Call the handler function, passing in the

 24         // httptest.ResponseRecorder and http.Request.

 25         handler.HandleHealth(rr, r)

 26

 27         // Call the Result() method on the http.ResponseRecorder to get the

 28         // http.Response generated by the handler.

 29         rs := rr.Result()

 30

 31         // We can then examine the http.Response to check that the status code // written by the handler was 200.

 32         if rs.StatusCode != http.StatusOK {

 33                 t.Errorf("want %d; got %d", http.StatusOK, rs.StatusCode)

 34         }

 35

 36         // And we can check that the response body written by the handler

 37         defer rs.Body.Close()

 38         body, err := ioutil.ReadAll(rs.Body)

 39         if err != nil {

 40                 t.Fatal(err)

 41         }

 42

 43         want := "my_id"

 44         got := string(body)

 45         if got != want {

 46                 t.Errorf("want body to equal %q. Got: %q", want, got)

 47         }

 48 }

运行该测试会导致:


internal/handler/health/handler_test.go|46| want body to equal "my_id". Got: ""

健康处理程序


   23 func (h *Handler) HandleHealth(w http.ResponseWriter, r *http.Request) {

   24         id := chi.URLParam(r, "id")

   25         log.Println("ID: ", id)

   26         render.PlainText(w, r, id)

   27 }

   28


   29 func RegisterRoutes(router *chi.Mux, handler *Handler) {

   30         router.Get("/health/{id}", handler.HandleHealth)

   31 }


心有法竹
浏览 220回答 1
1回答

慕后森

chi 库是用来处理通配符 URL 的。但是你通过直接调用绕过了你的测试HandleHealth。如果您希望 chi 处理您RegisterRoutes方法中提供的通配符的请求,您显然需要实际调用RegisterRoutes您的测试。这样做需要稍微改变你的测试结构。而不是:    handler.HandleHealth(rr, r)你需要类似的东西:    chi := chi.NewMux()    RegisterRoutes(chi, handler)    chi.ServeHTTP(rr, r)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go