为了账号安全,请及时绑定邮箱和手机立即绑定

当我使用 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 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号