Maison >développement back-end >Golang >Comment se moquer de « c.BindQuery » de Gin pour des tests unitaires efficaces ?
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 ?
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.
Pour simuler c.BindQuery, suivez ces étapes :
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 }
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.
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) }
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!