呼叫c.BindQuery 時,Gin 處理程序GFiletMaterial 。如何透過模擬函數來解決這個問題?
問題源自於測試過程中缺少實際的 HTTP 請求。若要執行基於 HTTP 的操作,必須初始化請求並將其設定到 Gin 上下文。具體來說,對於 c.BindQuery,正確初始化請求的 URL 和 URL.RawQuery 至關重要。
要模擬 c.BindQuery,請依照下列步驟操作:
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中文網其他相關文章!