首頁 >後端開發 >Golang >如何模擬 Gin 的 `c.BindQuery` 進行有效的單元測試?

如何模擬 Gin 的 `c.BindQuery` 進行有效的單元測試?

Barbara Streisand
Barbara Streisand原創
2024-12-30 15:43:14512瀏覽

How to Mock Gin's `c.BindQuery` for Effective Unit Testing?

模擬Gin 處理程序c.BindQuery 進行單元測試

問題

呼叫c.BindQuery 時,Gin 處理程序GFiletMaterial 。如何透過模擬函數來解決這個問題?

概述

問題源自於測試過程中缺少實際的 HTTP 請求。若要執行基於 HTTP 的操作,必須初始化請求並將其設定到 Gin 上下文。具體來說,對於 c.BindQuery,正確初始化請求的 URL 和 URL.RawQuery 至關重要。

模擬實作

要模擬 c.BindQuery,請依照下列步驟操作:

  1. 初始化 *gin.Context 和 *httptest.ResponseRecorder。
  2. 建立一個*http.Request 並根據需要設定其 URL 和 Header。
  3. 初始化請求查詢 (weldprogs.QueryParam) 並將其編碼到 URL.RawQuery。
  4. 將請求設定到Gin 上下文使用c.Request = req.
func mockGin() (*gin.Context, *httptest.ResponseRecorder) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

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

    testQuery := weldprogs.QueryParam{/* init fields */}
    q := req.URL.Query()
    for _, s := range testQuery.Basematgroup_id {
        q.Add("basematgroup_id", s)
    }

    req.URL.RawQuery = q.Encode()
    c.Request = req

    return c, w
}

模擬外部依賴項

此外,services.WeldprogService.GetMaterialParetMat ) 調用在當前形式下不可測試。它應該是一個接口,並作為處理程序的依賴項注入。

注入依賴項

func GetMaterialByFilter(c *gin.Context) {
    //...
    weldprogService := mustGetService(c)
    materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam)
    // ...
}

func mustGetService(c *gin.Context) services.WeldprogService {
    svc, exists := c.Get("svc_context_key")
    if !exists {
        panic("service was not set")
    }
    return svc.(services.WeldprogService)
}

模擬依賴項

type mockSvc struct {
}

// have 'mockSvc' implement the interface 

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

    // now you can set mockSvc into the test context
    c.Set("svc_context_key", &mockSvc{})

    GetMaterialByFilter(c)
    // ... 
}

透過組合這些技術,您可以有效地模擬c.BindQuery 和外部依賴項,從而允許對Gin 處理程序函數進行全面的單元測試。

以上是如何模擬 Gin 的 `c.BindQuery` 進行有效的單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn