为什么我使用杜松子酒和围棋的测试没有通过?

我正在尝试测试我的 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找不到json密钥,给出错误mykeyKey: 'ID' Error:Field validation for 'ID' failed on the 'required' tag


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


三国纷争
浏览 88回答 1
1回答

九州编程

Gin 根据请求选择要使用的绑定。Content-Type使用 Bind 方法时,Gin 会尝试根据内容类型标头推断绑定程序。如果您确定要绑定的内容,则可以使用 MustBindWith 或 ShouldBindWith。将代码更改为:    req, err := http.NewRequest("POST", "/", body)     require.Nil(t, err)     req.Header.Set("Content-Type", "application/json")     router.ServeHTTP(w, req)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go