在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中文網其他相關文章!