全书目录

第三十二篇:Gin 完全指南 —— 高速交警中枢宇宙

第十四章:测试 —— 真正专业的交警中枢,不会靠肉眼盯浏览器验车

1 分钟 186 字 第 605 / 962 个阅读单元

Gin 的 HTTP 测试路线非常清晰:

优先用 net/http/httptest

#1. 一个最小测试例子
go
func setupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.String(http.StatusOK, "pong")
    })
    return r
}

func TestPing(t *testing.T) {
    gin.SetMode(gin.TestMode)

    r := setupRouter()
    w := httptest.NewRecorder()
    req, _ := http.NewRequest(http.MethodGet, "/ping", nil)

    r.ServeHTTP(w, req)

    if w.Code != http.StatusOK {
        t.Fatalf("expected 200, got %d", w.Code)
    }
    if w.Body.String() != "pong" {
        t.Fatalf("unexpected body: %s", w.Body.String())
    }
}
#2. 为什么这套测试很自然

因为 Gin 本质上就是 http.Handler,所以测试时根本不需要真的把服务跑起来:

text
构造请求
  │
  ▼
交给 Gin Engine
  │
  ▼
录制响应
  │
  ▼
断言状态码、响应体、Header
#3. gin.TestMode 的意义

官方测试文档专门提醒:

go
gin.SetMode(gin.TestMode)

这样能关闭测试里那些不必要的 debug 路由注册输出,让测试日志干净很多。