Schreiben Sie einen Test in GO-Sprache + Gin

Einführung

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

Referenziert

Umgebung

go version go1.13.8 linux/amd64

Code

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()
}

Lassen Sie uns testen

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.

Ende

Für Bind JSON in main.go Untersuchungshinweise zur Ginbindung und -validierung

Recommended Posts

Schreiben Sie einen Test in GO-Sprache + Gin
Schreiben Sie Spinnen-Tests in Scrapy
Versuchen Sie, Yuma in der Sprache Go zu implementieren
Schreiben Sie einen C-Sprach-Unit-Test in Python
Machen Sie etwas objektorientiertes in der GO-Sprache
Java-Programmierer berührt Go-Sprache (Java-Vererbung in Go-Sprache implementieren)
Schreiben Sie DCGAN mit Keras
Schreiben Sie Tests in Python, um die Abdeckung zu profilieren und zu überprüfen
Erstellen Sie einen Webserver in der Sprache Go (net / http) (1)
Gehen Sie in die Sprache, um Teil 7 C in der Sprache GO zu sehen und sich daran zu erinnern
[Go language] So erhalten Sie Terminaleingaben in Echtzeit
Einbettung der Maschinensprache in die Sprache C.
Schreiben Sie die Standardeingabe in den Code
Schreiben Sie die Beta-Distribution in Python
Schreiben Sie Python in Rstudio (reticulate)
Schreiben Sie Spigot in VS Code
Implementieren Sie den rekursiven Abschluss in Go
Schreiben Sie Daten im HDF-Format
go Sprachen lernen verschiedene Notizen 1
[Golang] Über den Sprachkanal Go
Made gomi, ein Papierkorb-Tool für rm in Go-Sprache