为什么我的 Gin and Go 测试没有通过?

Why my test with Gin and Go is not passing?

我正在尝试测试我的 API。 在这种情况下,我有这个主文件:

package main

import (
    "fmt"
    "net/http"

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

func main() {
    r := getRouter()
    r.Run(":8080")
}

func getRouter() *gin.Engine {
    // We create the instance for Gin
    r := gin.Default()

    // Path to the static files. /static is rendered in the HTML and /media is the link to the path to the  images, svg, css.. the static files
    r.StaticFS("/static", http.Dir("../media"))

    // Path to the HTML templates. * is a wildcard
    r.LoadHTMLGlob("*.html")

    r.NoRoute(renderHome)
    // This get executed when the users gets into our website in the home domain ("/")
    r.GET("/", renderHome)
    r.POST("/", getData)
    return r
}

func renderHome(c *gin.Context) {
    c.HTML(http.StatusOK, "my-html.html", gin.H{})
}

func getData(c *gin.Context) {
    formData := &struct {
        ID int `json:"mykey"  binding:"required" `
    }{}
    // Validation (with Gin)
    if err := c.Bind(formData); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        fmt.Print(err)
        return
    }
}

我有这个 main_test 文件

package main

import (
    "bytes"
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestPost(t *testing.T) {
    // Create Infraestructure
    router := getRouter()
    w := httptest.NewRecorder()
    // Rent Bike
    body := bytes.NewBuffer([]byte("{\"mykey\":1}"))
    req, _ := http.NewRequest("POST", "/", body)
    router.ServeHTTP(w, req)
    // Test data
    assert.Equal(t, http.StatusOK, w.Code)
}

测试失败,因为在绑定时,Gin 没有找到 mykey json 键,给出错误 Key: 'ID' Error:Field validation for 'ID' failed on the 'required' tag

为什么会这样?我尝试以不同的方式格式化 JSON 正文,但无法使其正常工作

Gin根据请求选择使用哪个绑定Content-Type

When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use MustBindWith or ShouldBindWith.

将您的代码更改为:

    req, err := http.NewRequest("POST", "/", body)
    require.Nil(t, err)
    req.Header.Set("Content-Type", "application/json")
    router.ServeHTTP(w, req)