當我使用 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 }
1 回答

慕后森
TA貢獻1802條經驗 獲得超5個贊
chi 庫是用來處理通配符 URL 的。但是你通過直接調用繞過了你的測試HandleHealth。
如果您希望 chi 處理您RegisterRoutes方法中提供的通配符的請求,您顯然需要實際調用RegisterRoutes您的測試。
這樣做需要稍微改變你的測試結構。而不是:
handler.HandleHealth(rr, r)
你需要類似的東西:
chi := chi.NewMux()
RegisterRoutes(chi, handler)
chi.ServeHTTP(rr, r)
- 1 回答
- 0 關注
- 190 瀏覽
添加回答
舉報
0/150
提交
取消