[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 响应的方法,希望这对你有用。


Practice makes perfect.

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

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

讨论数量: 1

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

3周前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

短小精湛的 Golang 入门教程,是 The Little Go Book 的中文翻译
Github 上《The Way to Go》中文译本的镜像,优化了排版
@无闻 出品的一套面向新手级别学习者 Go 语言的视频教程
一步步带你进入 Go Web 编程的世界,让我们开始探索吧!
号称宇宙最快的 Iris Web 框架的中文文档翻译
Gin 是一个用 Go 语言编写的 WEB 框架,本文档为其中文版本
GORM 是优秀的 Golang ORM 类库,本文档是其官方文档的中文翻译,每年更新