亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我使用 http.NewRequest 進行測試時,為什么我的請求 URL 解析不正確?

當我使用 http.NewRequest 進行測試時,為什么我的請求 URL 解析不正確?

Go
心有法竹 2022-06-27 17:25:40
當我使用 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)


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號