[Go 教程] 如何在 Gin 框架中测试 JSON 响应?

图片

最近我在使用 Go 语言编写的 Gin 框架来实施一些小的项目。我知道对 Go 来说,配置测试程序是非常容易的,但令我非常惊讶的是,没有多少人对如何覆盖 APIs 的 JSON 响应结果的测试用例有足够的了解。特别是 Gin。

我发现,这很简单。

首先,我们对一个端点进行测试。下面的代码将会返回一个简单的 {"hello":"world"} JSON 响应。使用 GET 方法请求 / 时,将会调用 main.go 程序:

package main

import (
   "net/http"

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

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

func SetupRouter() *gin.Engine {
   router := gin.Default()

   router.GET("/", func(c *gin.Context) {
      c.JSON(http.StatusOK, gin.H{
          "hello": "world",
      })
   })

   return router
}

接下来遵循 Go 的约定,我们创建另一个文件来测试 main.go

package main

import (
   "encoding/json"
   "net/http"
   "net/http/httptest"
   "testing"

   "github.com/gin-gonic/gin"
   "github.com/stretchr/testify/assert"
)

func performRequest(r http.Handler, method, path string) *httptest.ResponseRecorder {
   req, _ := http.NewRequest(method, path, nil)
   w := httptest.NewRecorder()
   r.ServeHTTP(w, req)
   return w
}

func TestHelloWorld(t *testing.T) {
   // 构建我们预期的响应体
   body := gin.H{
      "hello": "world",
   }

   // 抓取我们的路由
   router := SetupRouter()

   // 使用抓取到的处理程序执行一个 GET 请求。
   w := performRequest(router, "GET", "/")

   // 断言我们的编码是否正确,
   // 请求将会给与一个 200 状态码
   assert.Equal(t, http.StatusOK, w.Code)

   // 将 JSON 响应转换为 map
   var response map[string]string
   err := json.Unmarshal([]byte(w.Body.String()), &response)

   // 抓取它的值 和 它是否存在
   value, exists := response["hello"]

   // 对响应做一些断言。
   assert.Nil(t, err)
   assert.True(t, exists)
   assert.Equal(t, body["hello"], value)
}

在这些文件所处的目录中执行 go test 命令将会运行这些测试程序。我花了一段时间才找到有实质性的用例,这是我现在用来验证 JSON 响应的方法,希望这对你有用。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://medium.com/@craigchilds94/testin...

译文地址:https://learnku.com/go/t/26362

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 1

太棒了, 正是我想学的框架 :star2:

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!