demo1/demo1.go源码及解析
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
)
func Index(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"id": 101,
"name": "张三",
})
}
func main() {
//gin.Default()返回一个引擎实例,该实例已经连接了记录器和恢复中间件。
//gin.Default()实际上进行了3步操作
//1. debugPrintWARNINGDefault()
//默认的调试打印输出
//2. engine := New()
//New返回一个新的空白引擎实例,不附带任何中间件。
//engine.Use(Logger(), Recovery())
//engine.Use将一个全局中间件连接到路由器。
//通过Use()连接的中间件将包含在每个请求的处理程序链中。
//甚至404、405,静态文件...
//Logger()实例一个Logger中间件,它将把日志写到gin.DefaultWriter。
//默认情况下是gin.DefaultWriter = os.Stdout。
//Recovery()返回一个中间件,它可以从任何panics(恐慌)中恢复过来,如果有500,它会写入500。
app := gin.Default()
//GET是router.Handle("GET", path, handle)的路由快捷写法。
app.GET("/", Index)
//app.Run():启用http.Server路由,并开始侦听和服务HTTP请求。
err := app.Run(":80")
if err != nil {
log.Panicln(err.Error())
}
}
demo1/demo1_test.go单元测试源码及解析
package main
import (
"github.com/gin-gonic/gin"
"io/ioutil"
"log"
"net/http/httptest"
"testing"
)
func TestIndex(t *testing.T) {
//设置log显示信息格式
//log.LstdFlags:表示标准输出 Ldate | Ltime
//log.Llongfile:表示输出长文件名和行号
log.SetFlags(log.LstdFlags | log.Llongfile)
//gin.Default()返回一个引擎实例,该实例已经连接了记录器和恢复中间件。
//gin.Default()实际上进行了3步操作
//1. debugPrintWARNINGDefault()
//默认的调试打印输出
//2. engine := New()
//New返回一个新的空白引擎实例,不附带任何中间件。
//engine.Use(Logger(), Recovery())
//engine.Use将一个全局中间件连接到路由器。
//通过Use()连接的中间件将包含在每个请求的处理程序链中。
//甚至404、405,静态文件...
//Logger()实例一个Logger中间件,它将把日志写到gin.DefaultWriter。
//默认情况下是gin.DefaultWriter = os.Stdout。
//Recovery()返回一个中间件,它可以从任何panics(恐慌)中恢复过来,如果有500,它会写入500。
router := gin.Default()
//GET是router.Handle("GET", path, handle)的路由快捷写法。
router.GET("/", Index)
//func NewRequest(method string, target string, body io.Reader) *http.Request
//对于http.Handler单元测试,可以使用NewRequest返回一个新的传入服务器请求。
//在测试的过程中,当NewRequest发生错误时,会触发panics(恐慌),
//method:可以是POST、GET等,默认的就是"GET"
//target:可以是路径,也可以是绝对网址。如果目标是绝对网址,则使用该网址的主机名。
//body:可以是nil,如果body是*bytes.Reader类型、*strings.Reader类型、*bytes.Buffer,需要设置请求长度。
req := httptest.NewRequest("GET", "/", nil)
//func NewRecorder() *ResponseRecorder
//httptest.NewRecorder()将返回一个初始化的ResponseRecorder.
w := httptest.NewRecorder()
//ServeHTTP通过参数w和req设置HTTP请求
router.ServeHTTP(w, req)
//w.Result():返回处理程序生成的响应。
//返回的响应包括:状态码、标题、正文和可选的尾部。
result := w.Result()
//result.Body表示响应体。
//读取body字段时,响应body将按需流式传输。
//如果网络连接失败或服务器终止响应,读取body返回non-nil。
//如果服务器用分块传输,body将自动删除。
bytes, err := ioutil.ReadAll(result.Body)
if err != nil {
log.Fatalln(err.Error())
}
log.Println(string(bytes))
t.Log(string(bytes))
}