Maison >développement back-end >Golang >Comment se moquer de « c.BindQuery » de Gin pour des tests unitaires efficaces ?

Comment se moquer de « c.BindQuery » de Gin pour des tests unitaires efficaces ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-30 15:43:14512parcourir

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

Mocking Gin Handler c.BindQuery pour les tests unitaires

Problème

Un test unitaire pour une fonction de gestionnaire Gin GetMaterialByFilter échoue lorsque c.BindQuery est appelé . Comment ce problème peut-il être résolu en se moquant de la fonction ?

Vue d'ensemble

Le problème provient de l'absence de requête HTTP réelle lors des tests. Pour effectuer des opérations basées sur HTTP, une requête doit être initialisée et définie dans le contexte Gin. Plus précisément, pour c.BindQuery, une initialisation appropriée de l'URL et de l'URL.RawQuery de la requête est cruciale.

Implémentation simulée

Pour simuler c.BindQuery, suivez ces étapes :

  1. Initialisez un *gin.Context et *httptest.ResponseRecorder.
  2. Créez un *http.Request et définissez son URL et son en-tête selon vos besoins.
  3. Initialisez la requête de requête (weldprogs.QueryParam) et encodez-la dans l'URL.RawQuery.
  4. Définissez la requête sur le contexte Gin en utilisant 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
}

Moquement des dépendances externes

De plus, l'appel services.WeldprogService.GetMaterialByFilter(&queryParam) n'est pas testable dans sa forme actuelle. Il doit s'agir d'une interface et injecté en tant que dépendance du gestionnaire.

Injecter la dépendance

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

Se moquer de la dépendance

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

En combinant ces techniques, vous peut efficacement se moquer de c.BindQuery et des dépendances externes, permettant des tests unitaires complets des fonctions de votre 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!

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