基於gin的golang web開發:Gin技術拾遺
阿新 • • 發佈:2020-12-04
本文是對前幾篇文章的一些補充,主要包含兩部分:單元測試和實際專案中使用路由的小問題。
### 拾遺1:單元測試
Golang單元測試要求程式碼檔案以```_test```結尾,單元測試方法以```Test```開頭,引數為*testing.T型別。以下是一個計算hash值的工具包和對應的單元測試。
hashUtils.go
```golang
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
```golang
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跳轉呢?
其實我們只要在增加一個空路徑路由就可以解決問題。
```golang
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技術拾遺][source]
[source]: https://www.huaface.com/arti