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