用反射闭包了一下 Gin 的 HandlerFunc, 我终于可以开开心心的写单元测试了

2023-03-16 15:38:11 +08:00
 maocat

上家公司是用 go-micro 写 rpc, 现在跑过来写 gin, 写单元测试构造用例可太麻烦了

用反射封装了一下,我又回到当初写微服务的快乐了

没有破坏路由也没有破坏中间件,就加了 req 和 resp 的反射封装

废话多说,上个例子


package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/maocatooo/thin/gin_handler"
)

type Req struct {
	Name string `json:"name"`
}

type Query struct {
	Name string `form:"name"`
}

type Resp struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

/*
GET http://127.0.0.1:8080/ping?name=123
*/
func Ping(ctx *gin.Context, req *Query, rsp *Resp) error {
	fmt.Printf("Ping req: %+v \n", *req)
	if req.Name == "123" {
		return fmt.Errorf("err 123")
	}
	rsp.Code = 200
	rsp.Message = req.Name
	return nil
}

type A struct {
	a string
}

/*
POST http://127.0.0.1:8080/pong
{
	"name":"456"
}
*/
func (a A) Pong(ctx *gin.Context, req *Req, rsp *Resp) error {
	fmt.Printf("Pong req: %+v \n", *req)
	if req.Name == "123" {
		return fmt.Errorf("123")
	}
	rsp.Code = 200
	rsp.Message = req.Name
	return nil
}

func main() {
	r := gin.Default()
	r.GET("/ping", gin_handler.Query(Ping))
	r.POST("/pong", gin_handler.JSON(A{a: "a123"}.Pong))
	_ = r.Run()
}

基佬链接: https://github.com/maocatooo/thin/tree/main/gin_handler

求个 star

1000 次点击
所在节点    程序员
1 条回复
ternice
2023-03-16 15:59:35 +08:00
gin 的单测很难写吗?

```
//初始化路由和 handlers 可以全局初始化,
r := gin.Default()
// ..todo init handlers

// 模拟发送
reqBody := ``
req, _ := http.NewRequest("GET", "/api/ping", strings.NewReader(reqBody))
req.Header.Set("Content-Type", "application/json; charset=utf-8")

recorder := httptest.NewRecorder()

r.ServeHTTP(recorder, req)

//处理结果
rp := resp.Resp{}

err := json.Unmarshal(recorder.Body.Bytes(), &rp)

println(recorder.Body.String())

if err != nil {
t.Errorf(err.Error())
}

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/924544

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX