为什么我的 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)
我正在尝试测试我的 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)