当我使用 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 关注
- 219 浏览
添加回答
举报
0/150
提交
取消
