Heim >Backend-Entwicklung >Golang >Wie kann man Go Gin-Handlerfunktionen mit Datenbindung und Dienstabhängigkeiten effektiv einem Unit-Test unterziehen?

Wie kann man Go Gin-Handlerfunktionen mit Datenbindung und Dienstabhängigkeiten effektiv einem Unit-Test unterziehen?

Susan Sarandon
Susan SarandonOriginal
2024-12-29 20:36:11626Durchsuche

How to Effectively Unit Test Go Gin Handler Functions with Data Binding and Service Dependencies?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn