Ecrire un test en langue GO + gin

introduction

Veuillez consulter sourcegraph.com/github pour le moment. Cet article présente une partie du code que vous avez vu précédemment. Écrivons un test simple avec golang + gin. Difficile à tester

Référencé

environnement

go version go1.13.8 linux/amd64

code

Créez main.go. http://localhost:8080/ping Lorsque vous vous connectez à, "pong" est renvoyé. Si vous définissez / ps (post) sur {"nom": "quelqu'un"}, le message "quelqu'un" sera renvoyé. En cas d'erreur, "error" est renvoyé.

main.go


package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

type User struct {
	Name string `json:"name" binding:"required"`
}

func router() *gin.Engine {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		// const StatusOK untyped int = 200
		// gin.H est la carte[string]interface{}Pareil que
		c.JSON(http.StatusOK, gin.H{"msg": "pong"})
	})
	r.POST("/ps", func(c *gin.Context) {
		var u User
		if err := c.BindJSON(&u); err != nil {
			// const StatusUnauthorized untyped int = 401
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"msg": "error"})
			return
		}
		c.JSON(http.StatusOK, gin.H{"msg": u})
	})
	return r
}
func main() {
	router().Run()
}

Testons

Ceci est le test officiel.

Test 1


func TestPingRouter(t *testing.T) {
	router := router()
	w := httptest.NewRecorder()
	//c, _ := gin.CreateTestContext(w)
	req, _ := http.NewRequest("GET", "/ping", nil)
	router.ServeHTTP(w, req)

	assert.Equal(t, 200, w.Code)
	// ...
	assert.Equal(t, w.Body.String(), "{\"msg\":\"pong\"}")
}

Vient ensuite le test POST. Ce test envoie "foo". Ensuite, il sera retourné en JSON. Vérifiez ensuite si c'est "toto". S'il correspond, le test réussit. Il semble intéressant d'ajouter assert.Equal () l'un après l'autre et d'essayer diverses choses. (Supplément) c.Request, _ = http.NewRequest () -> Comment écrire context_test.go. req, _: = http.NewRequest () -> Comment écrire une partie de gin semblable à un tutoriel req et c.Request étaient probablement les mêmes, les deux étaient des requêtes *.

Test 2


func TestPs(t *testing.T) {
	router := router()
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	body := bytes.NewBufferString("{\"name\":\"foo\"}")
	c.Request, _ = http.NewRequest("POST", "/ps", body)
	// req, _ := http.NewRequest("POST", "/ps", body)
	router.ServeHTTP(w, c.Request)

	assert.JSONEq(t, w.Body.String(), "{\"msg\":{\"name\":\"foo\"}}")
	assert.Equal(t, w.Code, 200)
	// ...
}

Presque le même que dans context_test.go

Test 3


func TestPs2(t *testing.T) {
	w := httptest.NewRecorder()
	c, _ := gin.CreateTestContext(w)
	body := bytes.NewBufferString("{\"foo\":\"bar\",\"bar\":\"foo\"}")
	c.Request, _ = http.NewRequest("POST", "/ps", body)
	c.Request.Header.Add("Content-Type", binding.MIMEJSON)
	var obj struct {
		Foo string `json:"foo"`
		Bar string `json:"bar"`
	}
	c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"msg": "error"})
	assert.Equal(t, w.Code, 401)
	assert.Equal(t, w.HeaderMap.Get("Content-Type"), "application/json; charset=utf-8")
	assert.NoError(t, c.BindJSON(&obj))
	assert.Equal(t, obj.Foo, "bar")
	assert.Equal(t, obj.Bar, "foo")
	assert.NotEqual(t, obj.Foo, "xxxx")
	assert.Empty(t, c.Errors)
}

Le test 1 est le test / ping (GET) et le test 2 et le test 3 sont le test / ps (POST).

fin

Pour Bind JSON dans main.go, Notes d'enquête sur la liaison et la validation du gin

Recommended Posts

Ecrire un test en langue GO + gin
Ecrire des tests Spider dans Scrapy
Essayez d'implémenter Yuma en langage Go
Ecrire un test unitaire de langage C en Python
Faites quelque chose orienté objet dans le langage GO
Le programmeur Java a touché le langage Go (implémenter l'héritage Java en langage Go)
Ecrire DCGAN avec Keras
Écrire des tests en Python pour profiler et vérifier la couverture
Créer un serveur Web en langage Go (net / http) (1)
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO
[Go language] Comment obtenir l'entrée du terminal en temps réel
Intégration du langage machine en langage C
Ecrire l'entrée standard dans le code
Écrire une distribution bêta en Python
Ecrire python dans Rstudio (réticulé)
Ecrire Spigot dans VS Code
Mettre en œuvre une fermeture récursive dans Go
Écrire des données au format HDF
go Apprentissage des langues notes diverses 1
[Golang] À propos de la chaîne linguistique Go
Made Gomi, un outil de corbeille pour RM en langue Go