Heim >Backend-Entwicklung >Golang >Wie kann man Go Gin-Handlerfunktionen mit Datenbindung und Dienstabhängigkeiten effektiv einem Unit-Test unterziehen?
So testen Sie eine Go-Gin-Handler-Funktion mit Anforderungsdatenbindung in Unit-Tests
Beim Unit-Testen von Gin-Handler-Funktionen wird die Anforderung ordnungsgemäß initialisiert und festgelegt Body- und Abfrageparameter sind von entscheidender Bedeutung. Sehen wir uns an, wie man c.BindQuery effektiv testet.
Im bereitgestellten Testcode funktioniert c.BindQuery nicht, da die HTTP-Anfrage nicht mit Abfrageparametern initialisiert ist. Um c.BindQuery zu verspotten, müssen Sie eine Testanfrage erstellen und deren URL und URL.RawQuery entsprechend festlegen. Hier ist eine verbesserte Version:
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 }
Sobald Sie die Abfragebindung simuliert haben, können Sie c.BindQuery in Ihrer Handlerfunktion GetMaterialByFilter testen.
Dienstabhängigkeiten testen
Ihre Handlerfunktion ruft auch den Dienst „services.WeldprogService.GetMaterialByFilter“ auf. Um diesen Aufruf testbar zu machen, sollte der Dienst eine Schnittstelle sein, die als Abhängigkeit Ihres Handlers eingefügt werden kann.
So geht das:
// 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) }
Jetzt können Sie das verspotten Service in Ihren Unit-Tests und steuern Sie sein Verhalten:
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) // ... }
Das obige ist der detaillierte Inhalt vonWie kann man Go Gin-Handlerfunktionen mit Datenbindung und Dienstabhängigkeiten effektiv einem Unit-Test unterziehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!