[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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: