如何使用請求資料綁定對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中文網其他相關文章!