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

本文是對前幾篇文章的一些補充,主要包含兩部分:單元測試和實際項目中使用路由的小問題。

拾遺1:單元測試

Golang單元測試要求代碼文件以_test結尾,單元測試方法以Test開頭,參數爲*testing.T類型。如下是一個計算hash值的工具包和對應的單元測試。前端

hashUtils.gogit

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.gogithub

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相關的代碼。golang

啓動一個Gin服務器main.goweb

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都會獲得正確的結果。url

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

相關文章
相關標籤/搜索