首页 >后端开发 >Golang >如何使用模拟有效地对 Gin 处理程序功能进行单元测试?

如何使用模拟有效地对 Gin 处理程序功能进行单元测试?

DDD
DDD原创
2024-12-17 20:31:12814浏览

How to Effectively Unit Test Gin Handler Functions with Mocks?

对 Gin 处理程序函数进行单元测试的模拟

测试 c.BindQuery 功能

要测试涉及 Gin 中 HTTP 请求的操作,请初始化 *http .Request 并将其设置为 Gin 上下文。专门用于测试 c.BindQuery,初始化请求的 URL 和 URL.RawQuery:

import (
    "net/http/httptest"

    "github.com/gin-gonic/gin"
)

func mockGin() (*gin.Context, *httptest.ResponseRecorder) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // Test request
    req := &http.Request{
        URL: &url.URL{},
        Header: make(http.Header),
    }

    // Test query
    testQuery := weldprogs.QueryParam{/* init fields */}

    q := req.URL.Query()
    for _, s := range testQuery.Basematgroup_id {
        q.Add("basematgroup_id", s)
    }

    // Set URL.RawQuery
    req.URL.RawQuery = q.Encode()

    // Set request to Gin context
    c.Request = req

    return c, w
}

模拟 JSON 绑定

请参阅此资源以获取有关模拟 JSON 绑定的指南。

测试服务

服务如services.WeldprogService.GetMaterialByFilter(&queryParam) 无法按原样进行测试。要使它们可测试:

  • 将它们转换为接口。
  • 将它们作为依赖项注入到处理程序中。
  • 将它们设置为 Gin 上下文值。

接口和上下文值方法:

type services interface {
    GetMaterialByFilter(*weldprogs.QueryParam) (*weldprogs.MaterialByFilter, error)
}

func mockWeldprogService(service services) {
    return func(c *gin.Context) {
        c.Set("svc_context_key", service)
    }
}

func TestGetMaterialByFilter(t *testing.T) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    c.Use(mockWeldprogService(&mockSvc{}))

    GetMaterialByFilter(c)

    // ...
}

以上是如何使用模拟有效地对 Gin 处理程序功能进行单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn