rest - 测试基于 gin 的 REST API 在使用 net/http/httptest 时没有获取参数

标签 rest testing go go-gin

我正在开发基于 Gin Go 的 REST API,端点如下所示:

func carsByType(c *gin.Context) {
    fmt.Println("Go Request in Handler...")
    carType := c.Params.ByName("type")
    fmt.Println(carType)
    if carType != "" {

    }
    c.JSON(http.StatusBadRequest, gin.H{"result": "Bad request"})
    return
}

func main() {
    router := gin.Default()
    router.GET("/cars/:type", carsByType)
    router.Run(":80")
}

当我通过浏览器和 cURL 向端点发出请求时,它工作正常,获取 carType 值,但是当我运行测试时,它返回错误请求并获取 carType 为“”。

为了测试端点,我的测试代码如下所示:

func TestGetcarsByType(t *testing.T) {
    gin.SetMode(gin.TestMode)
    handler := carsByType
    router := gin.Default()
    router.GET("/cars/1", handler)

    req, err := http.NewRequest("GET", "/cars/1", nil)
    if err != nil {
        fmt.Println(err)
    }
    resp := httptest.NewRecorder()
    router.ServeHTTP(resp, req)
    assert.Equal(t, resp.Code, 200)
}       

我做错了什么?

最佳答案

router.GET("/cars/1", handler) 在您的测试中应该是 router.GET("/cars/:type", handler)

请注意,更好(更可测试;路由重复更少)是创建一个返回所有路由的 SetupRouter() *gin.Engine 函数。例如

// package main

// server.go
// This is where you create a gin.Default() and add routes to it
func SetupRouter() *gin.Engine {
    router := gin.Default()
    router.GET("/cars/:type", carsByType)

    return router
}

func main() {
    router := SetupRouter() 
    router.Run()
}

// router_test.go
testRouter := SetupRouter()

req, err := http.NewRequest("GET", "/cars/1", nil)
if err != nil {
    fmt.Println(err)
}

resp := httptest.NewRecorder()
testRouter.ServeHTTP(resp, req)
assert.Equal(t, resp.Code, 200)

关于rest - 测试基于 gin 的 REST API 在使用 net/http/httptest 时没有获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35988767/

相关文章:

java - 拦截客户端与spring的断开连接?

java - JUnit 4 与 TestNG 6

c# - 如何测试函数返回 IEnumerable<Integer>

go - Go 中的 "go"关键字

http - 如何从 golang 中的 url 中删除 index.html 路径

go - 如何修复 "Undefined ReadFile"

java - ReSTLet 响应类型

java - 使用 spring rest 模板在服务上传播 HTTP header (JWT token )

scala - 对于这种情况,如何在 Scala 中使用 "dispatch"HTTP 客户端库?

ruby - 检查测试是否失败并相应地给出控制台输出