Heim >Backend-Entwicklung >Golang >Wie kann man Gins „c.BindQuery' für effektive Unit-Tests verspotten?

Wie kann man Gins „c.BindQuery' für effektive Unit-Tests verspotten?

Barbara Streisand
Barbara StreisandOriginal
2024-12-30 15:43:14507Durchsuche

How to Mock Gin's `c.BindQuery` for Effective Unit Testing?

Verspottung des Gin-Handlers c.BindQuery für Unit-Tests

Problem

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?

Übersicht

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.

Mock-Implementierung

Um c.BindQuery zu simulieren, führen Sie die folgenden Schritte aus:

  1. Initialisieren Sie einen *gin.Context und *httptest.ResponseRecorder.
  2. Erstellen Sie einen *http.Request und legen Sie die URL und den Header nach Bedarf fest.
  3. Initialisieren Sie die Anforderungsabfrage (weldprogs.QueryParam) und kodieren Sie sie in die URL.RawQuery.
  4. Stellen Sie die Anforderung auf den Gin-Kontext ein mit c.Request = req.
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
}

Mocking External Abhängigkeiten

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.

Einfügung der Abhängigkeit

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)
}

Verspottung der Abhängigkeit

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!

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