Weitere Informationen finden Sie vorerst unter sourcegraph.com/github. In diesem Artikel wird ein Teil des Codes vorgestellt, den Sie zuvor gesehen haben. Schreiben wir einen einfachen Test mit Golang + Gin. Schwer zu testen
Ich habe den in Gin geschriebenen Test nachgeahmt. sourcegraph.com/github
Offiziell GoDoc
go version go1.13.8 linux/amd64
Erstellen Sie main.go. http://localhost:8080/ping Wenn Sie eine Verbindung herstellen, wird "pong" zurückgegeben. Wenn Sie / ps (post) auf {"name": "jemand"} setzen, wird die Nachricht "jemand" zurückgegeben. Im Fehlerfall wird "error" zurückgegeben.
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 ist Karte[string]interface{}Gleich wie
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()
}
Dies ist der offizielle Test.
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\"}")
}
Als nächstes folgt der POST-Test. Dieser Test sendet "foo". Dann wird es in JSON zurückgegeben. Überprüfen Sie dann, ob es "foo" ist. Wenn es übereinstimmt, ist der Test erfolgreich. Es scheint interessant, assert.Equal () nacheinander hinzuzufügen und verschiedene Dinge auszuprobieren. (Ergänzung) c.Request, _ = http.NewRequest () -> Wie schreibe ich context_test.go? req, _: = http.NewRequest () -> Wie schreibe ich einen Tutorial-ähnlichen Teil von Gin? req und c.Request waren wahrscheinlich gleich, beide waren * Requests.
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)
// ...
}
Fast das gleiche wie in 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)
}
Test 1 ist der / ping (GET) -Test und Test 2 und Test 3 sind der / ps (POST) -Test.
Für Bind JSON in main.go Untersuchungshinweise zur Ginbindung und -validierung
Recommended Posts