Maison > développement back-end > Golang > Comment se moquer efficacement de « c.BindQuery » et des appels de service dans les tests unitaires de fonction du gestionnaire Gin ?

Comment se moquer efficacement de « c.BindQuery » et des appels de service dans les tests unitaires de fonction du gestionnaire Gin ?

Susan Sarandon
Libérer: 2024-12-29 08:53:10
original
859 Les gens l'ont consulté

How to Effectively Mock `c.BindQuery` and Service Calls in Gin Handler Function Unit Tests?

Se moquer de c.BindQuery dans les tests unitaires de la fonction du gestionnaire Gin

Les tests unitaires des fonctions du gestionnaire Go Gin impliquent souvent de se moquer de certaines opérations pour isoler et tester des scénarios. L'une de ces opérations est c.BindQuery, qui lie les paramètres de chaîne de requête de requête à une structure donnée.

Lors du test de GetMaterialByFilter, le test échouerait en raison d'une erreur liée à un accès mémoire non valide ou à un déréférencement de pointeur nul. Cette erreur provient du fait que c.BindQuery n'a pas été correctement initialisé avec une requête HTTP valide.

Pour se moquer de c.BindQuery, créez une http.Request et définissez ses champs URL et URL.RawQuery. Cela permet de simuler la requête qui serait reçue par la fonction handler :

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
}
Copier après la connexion

Test des appels de service

La fonction handler effectue également un appel à un service méthode, services.WeldprogService.GetMaterialByFilter. Pour tester cet appel, le service doit être injectable, soit via la signature de la fonction du gestionnaire, soit en le définissant comme valeur de contexte Gin.

Si le service est une interface, il peut être injecté à l'aide de la méthode c.Set :

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)
}
Copier après la connexion

Moquez le service dans les tests unitaires en implémentant l'interface requise et en la définissant comme valeur de contexte de service :

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)
    // ... 
}
Copier après la connexion

En suivant En suivant ces étapes, vous pouvez vous moquer efficacement de c.BindQuery et des appels de service pour isoler et tester minutieusement votre fonction de gestionnaire Gin.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal