LoginSignup
1
0

More than 1 year has passed since last update.

Go(gin)のAPIテストでテストが止まってしまい終了しない

Posted at

はじめに

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())
}

ちなみにこれは公式ドキュメントのテストと全く同じです!公式ドキュメントに答えがありますね

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0