首頁 > 後端開發 > Golang > 如何使用模擬有效地對 Gin 處理程序功能進行單元測試?

如何使用模擬有效地對 Gin 處理程序功能進行單元測試?

DDD
發布: 2024-12-17 20:31:12
原創
810 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板