基於gin的golang web開發:Gin技術拾遺

陳巨集博發表於2020-12-04
本文是對前幾篇文章的一些補充,主要包含兩部分:單元測試和實際專案中使用路由的小問題。

拾遺1:單元測試

Golang單元測試要求程式碼檔案以_test結尾,單元測試方法以Test開頭,引數為*testing.T型別。以下是一個計算hash值的工具包和對應的單元測試。

hashUtils.go

package utils

import (
	"crypto/md5"
	"crypto/sha1"
	"fmt"
)

func Md5(str string) string {
	data := []byte(str)
	has := md5.Sum(data)
	return fmt.Sprintf("%X", has)
}

func SHA1(data []byte) []byte {
	h := sha1.New()
	h.Write(data)
	return h.Sum(nil)
}

hashUtils_test.go

package utils

import (
	"fmt"
	"testing"
)

func TestMd5(t *testing.T) {
	content := "123456"
	md5 := Md5(content)

	if "E10ADC3949BA59ABBE56E057F20F883E" != md5 {
		t.Errorf("md5 failed")
	}
}

func TestSHA1(t *testing.T) {
	content := "123456"
	sha1 := fmt.Sprintf("%x", SHA1([]byte(content)))

	if "7c4a8d09ca3762af61e59520943dc26494f8941b" != sha1 {
		t.Errorf("sha1 failed")
	}
}

除了測試這種邏輯程式碼我們還需要測試HTTP的請求響應。Gin推薦使用net/http/httptest測試HTTP相關的程式碼。

啟動一個Gin伺服器main.go

package main

func setupRouter() *gin.Engine {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.String(200, "pong")
	})
	return r
}

func main() {
	r := setupRouter()
	r.Run(":8080")
}

單元測試main_test.go

package main

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestPingRoute(t *testing.T) {
	router := setupRouter()

	w := httptest.NewRecorder()
	req, _ := http.NewRequest("GET", "/ping", nil)
	router.ServeHTTP(w, req)

	assert.Equal(t, 200, w.Code)
	assert.Equal(t, "pong", w.Body.String())
}

拾遺2:路由

先看程式碼

userRouter := router.Group(`users`)
{
	userRouter.GET(`/`, userHandler.UserList)
}

我們宣告瞭路由/users/,這是一個Web Api,傳入引數的url大概是這樣的/users/?pageIndex=1&pageSize=10。使用者訪問/users?pageIndex=1&pageSize=10時也能正常返回資料,這是因為Gin幫我們做了一次301跳轉,問題就出在這裡。我們的路由是Web Api使用者可能是JS前端,也可能是其他的業務系統。如果使用者不支援301跳轉呢?

其實我們只要在增加一個空路徑路由就可以解決問題。

userRouter := router.Group(`users`)
{
	userRouter.GET(``, userHandler.UserList)
	userRouter.GET(`/`, userHandler.UserList)
}

現在不管使用者訪問/users/?pageIndex=1&pageSize=10還是訪問/users?pageIndex=1&pageSize=10都會得到正確的結果。

文章出處:基於gin的golang web開發:Gin技術拾遺

相關文章