首頁 >後端開發 >Golang >如何使用資料綁定和服務依賴性有效地對 Go Gin 處理程序功能進行單元測試?

如何使用資料綁定和服務依賴性有效地對 Go Gin 處理程序功能進行單元測試?

Susan Sarandon
Susan Sarandon原創
2024-12-29 20:36:11626瀏覽

How to Effectively Unit Test Go Gin Handler Functions with Data Binding and Service Dependencies?

如何使用請求資料綁定對Go Gin 處理程序函數進行單元測試

在單元測試Gin 處理程序函數中,正確初始化和設定請求正文和查詢參數至關重要。讓我們深入研究如何有效地測試 c.BindQuery。

在提供的測試程式碼中,c.BindQuery 不起作用,因為 HTTP 請求未使用任何查詢參數進行初始化。要模擬 c.BindQuery,您需要建立一個測試請求並相應地設定其 URL 和 URL.RawQuery。這是一個改進的版本:

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

    // Create a test request with query parameters
    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
}

模擬查詢綁定後,您可以在處理函數 GetMaterialByFilter 中測試 c.BindQuery。

測試服務依賴關係

您的處理函數也會呼叫該服務services.WeldprogService.GetMaterialByFilter。要使此呼叫可測試,該服務應該是一個可以作為處理程序的依賴項注入的介面。

以下是執行此操作的方法:

// Define an interface for your service
type WeldprogService interface {
    GetMaterialByFilter(query *weldprogs.QueryParam) ([]weldprogs.Material, error)
}

// Inject the service into your handler as a context value
func GetMaterialByFilter(c *gin.Context) {
    //...
    weldprogService := mustGetService(c)
    materialByFilter, getErr := weldprogService.GetMaterialByFilter(&queryParam)
    // ...
}

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

現在,您可以模擬單元測試中的服務並控制其行為:

type mockSvc struct {
}

// Implement the WeldprogService interface on mockSvc

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

    // Set the mock service into the test context
    c.Set("svc_context_key", &mockSvc{})

    GetMaterialByFilter(c)
    // ... 
}

以上是如何使用資料綁定和服務依賴性有效地對 Go Gin 處理程序功能進行單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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