GinTest

ginTest

//go test -v .
func TestInfoHandler(t *testing.T) {
	// main
	gin.SetMode(gin.ReleaseMode)
	engine := gin.New()
	loadRoutes(engine) //設定你寫路由
	//StartHttpServer(errs, engine) // 略 不會真的執行

//--關鍵段落------------
	w := httptest.NewRecorder()                                   // 取得 ResponseRecorder 物件
	req, _ := http.NewRequest("GET", "/service/api/v1/info", nil) //使用 http 建立一個 Request
	engine.ServeHTTP(w, req)                                      //使用 gin 提供的 ServeHTTP 模擬 API 呼叫.response 會放入ResponseRecorder
//--------------
	//驗證發起請求後的回覆是否正確
	assert.Equal(t, http.StatusOK, w.Code)
	t.Log("body", w.Body.String()) //使用go test -v 才可以印出
	expactedResp := `{"name":"rest-demo","version":"1.0.0"}`
	if !reflect.DeepEqual(w.Body.String(), expactedResp) {
		t.Errorf("Resp(%s) != expactedResp(%s)", w.Body.String(), expactedResp)
	}
}


//其中部分關鍵段落可以抽出,下次可以覆用
// 模擬發生
func httpTestGetRequest(url string, engine *gin.Engine) *httptest.ResponseRecorder {
	w := httptest.NewRecorder()                                            // 取得 ResponseRecorder 物件
	req, _ := http.NewRequest(http.MethodGet, "/service/api/v1/info", nil) //使用 http 建立一個 Request
	engine.ServeHTTP(w, req)                                               //使用 gin 提供的 ServeHTTP 模擬 API 呼叫.response 會放入ResponseRecorder
	defer w.Result().Body.Close()
	return w
}

參考

要把建立 gin.Engine 與設定路由抽一個方法出來,因為等等寫測試的時候,會需要取得 gin.Engine 物件。

gin.ServeHTTP 的实现

Last updated