Heim >Backend-Entwicklung >Golang >Wie kann man Gins „c.BindQuery' für effektive Unit-Tests verspotten?
Ein Unit-Test für eine Gin-Handler-Funktion GetMaterialByFilter schlägt fehl, wenn c.BindQuery aufgerufen wird . Wie kann dieses Problem durch Verspotten der Funktion gelöst werden?
Das Problem ist auf das Fehlen einer tatsächlichen HTTP-Anfrage während des Tests zurückzuführen. Um HTTP-basierte Vorgänge auszuführen, muss eine Anfrage initialisiert und auf den Gin-Kontext festgelegt werden. Insbesondere für c.BindQuery ist die ordnungsgemäße Initialisierung der URL und URL.RawQuery der Anforderung von entscheidender Bedeutung.
Um c.BindQuery zu simulieren, führen Sie die folgenden Schritte aus:
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 }
Außerdem ist der Aufruf „services.WeldprogService.GetMaterialByFilter(&queryParam)“ in seiner aktuellen Form nicht testbar. Es sollte eine Schnittstelle sein und als Abhängigkeit des Handlers eingefügt werden.
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) // ... }
Durch die Kombination dieser Techniken können Sie kann c.BindQuery und externe Abhängigkeiten effektiv verspotten und so umfassende Unit-Tests Ihrer Gin-Handler-Funktionen ermöglichen.
Das obige ist der detaillierte Inhalt vonWie kann man Gins „c.BindQuery' für effektive Unit-Tests verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!