はじめに
GoのAPIテストを書いていて問題が発生したのでまとめます
ネットを調べたところ同じ現象が起きていなかったので、初心者の方の参考になればと思います
問題
ginで作成したAPIに対してリクエストが200返ってくるか確かめるコードを書いたのですテストが終わらず止まってしまいました
main.go
package main
var router *gin.Engin
func setupRouter() *gin.Engine {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
r.Run(":8080")
router = r
}
func main() {
r := setupRouter()
}
main_test.go
package main
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
)
func TestPingRoute(t *testing.T) {
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/ping", nil)
router.ServeHTTP(w, req)
assert.Equal(t, 200, w.Code)
assert.Equal(t, "pong", w.Body.String())
}
解決方法
これはrouter
を呼び出した時点でr.Run(":8080")
が呼び出されてサーバーが起動してしまうのが問題でした
以下のコードにすることでrouter参照時にサーバーが起動しないようにしました
main
で別途サーバーは呼び出すように修正しています
main.go
package main
func setupRouter() *gin.Engine {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
return r
}
func main() {
r := setupRouter()
r.Run(":8080")
}
main_test.go
package main
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
)
func TestPingRoute(t *testing.T) {
router := setupRouter()
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/ping", nil)
router.ServeHTTP(w, req)
assert.Equal(t, 200, w.Code)
assert.Equal(t, "pong", w.Body.String())
}
ちなみにこれは公式ドキュメントのテストと全く同じです!公式ドキュメントに答えがありますね
参考