Verspotten von c.BindQuery in Gin-Handler-Funktions-Unit-Tests
Beim Testen von Go-Gin-Handler-Funktionen geht es häufig darum, bestimmte Vorgänge zu verspotten, um sie zu isolieren und spezifisch zu testen Szenarien. Eine solche Operation ist c.BindQuery, die Anforderungsabfragezeichenfolgenparameter an eine bestimmte Struktur bindet.
Beim Testen von GetMaterialByFilter schlug der Test aufgrund eines Fehlers im Zusammenhang mit einem ungültigen Speicherzugriff oder einer Nullzeiger-Dereferenzierung fehl. Dieser Fehler ist auf die Tatsache zurückzuführen, dass c.BindQuery nicht ordnungsgemäß mit einer gültigen HTTP-Anfrage initialisiert wurde.
Um c.BindQuery zu verspotten, erstellen Sie eine http.Request und legen Sie deren URL- und URL.RawQuery-Felder fest. Dadurch können Sie die Anfrage simulieren, die von der Handler-Funktion empfangen würde:
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 }
Dienstaufrufe testen
Die Handler-Funktion ruft auch einen Dienst auf Methode, Services.WeldprogService.GetMaterialByFilter. Um diesen Aufruf zu testen, muss der Dienst injizierbar sein, entweder durch die Signatur der Handlerfunktion oder durch Festlegen als Gin-Kontextwert.
Wenn der Dienst eine Schnittstelle ist, kann er mit der c.Set-Methode injiziert 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) }
Machen Sie den Dienst in den Komponententests nach, indem Sie die erforderliche Schnittstelle implementieren und sie als Dienstkontextwert festlegen:
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) // ... }
Indem Sie diese befolgen Schritte können Sie sowohl c.BindQuery als auch Serviceaufrufe effektiv verspotten, um Ihre Gin-Handler-Funktion zu isolieren und gründlich zu testen.
Das obige ist der detaillierte Inhalt vonWie kann man „c.BindQuery' und Serviceaufrufe in Gin-Handler-Funktions-Unit-Tests effektiv verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!