首頁 > 後端開發 > Golang > 如何在 Gin 處理程序功能單元測試中有效模擬 `c.BindQuery` 和服務呼叫?

如何在 Gin 處理程序功能單元測試中有效模擬 `c.BindQuery` 和服務呼叫?

Susan Sarandon
發布: 2024-12-29 08:53:10
原創
855 人瀏覽過

How to Effectively Mock `c.BindQuery` and Service Calls in Gin Handler Function Unit Tests?

在Gin 處理函數單元測試中模擬c.BindQuery

單元測試Go Gin 處理函數通常涉及模擬某些操作來隔離和測試特定的操作場景。其中一個操作是 c.BindQuery,它將請求查詢字串參數綁定到給定的結構。

測試 GetMaterialByFilter 時,由於與無效記憶體存取或 nil 指標取消引用相關的錯誤,測試將失敗。此錯誤源自於 c.BindQuery 未使用有效的 HTTP 請求正確初始化。

要模擬 c.BindQuery,請建立一個 http.Request 並設定其 URL 和 URL.RawQuery 欄位。這允許您模擬處理程序函數將接收的請求:

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{/* ... */}

    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.GetMaterialByFilter 。要測試此調用,服務必須是可注入的,可以透過處理程序函數簽署或將其設定為 Gin 上下文值。

如果服務是接口,則可以使用c.Set 方法注入:

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)
}
登入後複製

通過實現所需的接口並將其設置為服務上下文來模擬單元測試中的服務value :

type mockSvc struct {}

func (mockSvc) GetMaterialByFilter(*weldprogs.QueryParam) (*materialByFilter, error) { /* ... */}

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

    c.Set("svc_context_key", &mockSvc{})

    GetMaterialByFilter(c)
    // ... 
}
登入後複製

透過執行以下步驟,您可以有效地模擬c.BindQuery 和服務調用,以隔離並徹底測試您的Gin處理程序函數。

以上是如何在 Gin 處理程序功能單元測試中有效模擬 `c.BindQuery` 和服務呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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