Maison >développement back-end >Golang >Comment tester efficacement les fonctions du gestionnaire de gin avec des simulations ?

Comment tester efficacement les fonctions du gestionnaire de gin avec des simulations ?

DDD
DDDoriginal
2024-12-17 20:31:12813parcourir

How to Effectively Unit Test Gin Handler Functions with Mocks?

Mocks pour tester unitairement les fonctions du gestionnaire Gin

Test de la fonctionnalité c.BindQuery

Pour tester les opérations impliquant la requête HTTP dans Gin, initialisez un *http .Request et définissez-le sur le contexte Gin. Spécifiquement pour tester c.BindQuery, initialisez l'URL et l'URL de la requête.RawQuery :

import (
    "net/http/httptest"

    "github.com/gin-gonic/gin"
)

func mockGin() (*gin.Context, *httptest.ResponseRecorder) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    // Test request
    req := &http.Request{
        URL: &url.URL{},
        Header: make(http.Header),
    }

    // Test query
    testQuery := weldprogs.QueryParam{/* init fields */}

    q := req.URL.Query()
    for _, s := range testQuery.Basematgroup_id {
        q.Add("basematgroup_id", s)
    }

    // Set URL.RawQuery
    req.URL.RawQuery = q.Encode()

    // Set request to Gin context
    c.Request = req

    return c, w
}

Mocking JSON Binding

Référez-vous à cette ressource pour obtenir des conseils sur la simulation de liaison JSON.

Services de tests

Des services comme services.WeldprogService.GetMaterialByFilter(&queryParam) ne peut pas être testé tel quel. Pour les rendre testables :

  • Convertissez-les en interfaces.
  • Injectez-les en tant que dépendances dans le gestionnaire.
  • Définissez-les comme valeurs de contexte Gin.

Approche de valeur d'interface et de contexte :

type services interface {
    GetMaterialByFilter(*weldprogs.QueryParam) (*weldprogs.MaterialByFilter, error)
}

func mockWeldprogService(service services) {
    return func(c *gin.Context) {
        c.Set("svc_context_key", service)
    }
}

func TestGetMaterialByFilter(t *testing.T) {
    w := httptest.NewRecorder()
    c, _ := gin.CreateTestContext(w)

    c.Use(mockWeldprogService(&mockSvc{}))

    GetMaterialByFilter(c)

    // ...
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn