La liaison des données JSON à une structure lors des requêtes HTTP est une tâche courante dans les applications Web . Cela peut devenir difficile lors de l'utilisation d'un cadre de test qui nécessite de se moquer du contexte de la demande. Plus précisément, se moquer de gin.Context pose des difficultés lorsque l'on tente de tester des fonctions qui s'appuient sur sa méthode BindJSON. Cet article fournit une solution complète à ce problème.
Tout d'abord, il est crucial d'instancier un gin.Context de test et de définir sa http.Request comme non nulle :
w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) c.Request = &http.Request{ Header: make(http.Header), }
Ensuite, nous pouvons nous moquer d'un corps POST JSON en utilisant la fonction suivante :
func MockJsonPost(c *gin.Context /* the test context */, content interface{}) { c.Request.Method = "POST" // or PUT c.Request.Header.Set("Content-Type", "application/json") jsonbytes, err := json.Marshal(content) if err != nil { panic(err) } // the request body must be an io.ReadCloser // the bytes buffer though doesn't implement io.Closer, // so you wrap it in a no-op closer c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonbytes)) }
Cette fonction accepte un paramètre content interface{} qui peut être marshallé en JSON à l'aide de json.Marshal(). Il peut s'agir d'une structure avec des balises JSON appropriées ou d'une interface map[string]{}.
Voici comment utiliser la fonction MockJsonPost dans un test :
func TestMyHandler(t *testing.T) { w := httptest.NewRecorder() ctx, _ := gin.CreateTestContext(w) ctx.Request = &http.Request{ Header: make(http.Header), } MockJsonPost(ctx, map[string]interface{}{"foo": "bar"}) MyHandler(ctx) assert.EqualValues(t, http.StatusOK, w.Code) }
Pour plus d'informations sur les tests des gestionnaires Gin, reportez-vous à ce qui suit ressource :
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!