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
J'ai imité le test écrit en gin. sourcegraph.com/github
Officiel GoDoc
go version go1.13.8 linux/amd64
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()
}
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).
Pour Bind JSON dans main.go, Notes d'enquête sur la liaison et la validation du gin
Recommended Posts