GolangのGinフレームワークで、ユニットテストを使ったら結構はまったのでメモします。
Gin Context
GinのContextを関数に渡したい時ってあると思う。
それでGinのテストソースを調査していたら、helpers_test.goの中にcontextを生成できるとあったので使ってみました。
import (
"gopkg.in/gin-gonic/gin.v1"
)
func TestHoge(t *testing.T) {
c, _, _ := gin.CreateTestContext()
huga(c)
}
func huga(c *gin.Context) {
....
}
実行
実行するには、下記のコマンドを使います。
$go test -v .
undefined: gin.CreateTestContex
undefinedが出てしまいました。
未定義なの?
頭文字が大文字だったらどこからでもアクセス出来るんじゃないの。
調べると ***_test.goは、頭文字を大文字にしてもアクセスできないみたいです。
まじかー、と思いつつどうする?
gin.Contextを一から生成するのめんどくさいなー。
色々試行錯誤しながら、やっとできました。
成功
import (
"gopkg.in/gin-gonic/gin.v1"
"net/http"
)
func TestHoge(t *testing.T) {
// リクエスト生成
req, _ : = http.NewRequest("GET", "/test", nil)
// Contextセット
var context *gin.Context
context = &gin.Context{Request: req}
huga(context)
}
func huga(c *gin.Context) {
....
}
httpパッケージのNewRequest関数を使って、ginのContextを生成します。
どうせサーバとして実行するわけじゃないので、NewRequestのURIの部分はなんでもOKです。
はまった点は、*gin.Contextの部分になります。
まだレシーバとかポインタとかうまく理解できてなかったです。
*gin.Context{Re…の部分の入れ方がわかってなくて型違いのエラーで結構はまりました。
一応上記のコードでいけました。
けどc.JSONとかは呼べないです。
実行するとpanic起こす!
その場合は、gin.Contextの足りない項目を生成してあげる。
あとクエリーストリングとは問題ないけど、パラメータの取得はgin.ContextにParamsを追加してあげる。
テストによるパラメータの取得の仕方
// /test/1 <- 1の部分
func TestHoge(t *testing.T) {
// パラメータ生成
param := gin.Param{"classificationId", "1"}
params := gin.Params{param}
// リクエスト生成
req, _ := http.NewRequest("GET", "/test/1", nil)
// Contextセット
var context *gin.Context
context = &gin.Context{Request: req, Params: params}
...
}
NewRequestに/test/1とか入れたりしても取得できないです。
gin.Paramを生成してあげて、さらにgin.Paramsに入れます。
それをgin.ContextにParamsとして入れてあげればOKです。
POSTデータを渡したい時は、net/urlパッケージを利用すると強引かもしれないけど問題なくいけました。
まとめ
Ginフレームワークで、ユニットテストを行いました。
途中でエラーとかのトラブルとかありましたが、ちゃんと実行出来たと思います。
-
Golang Ginを使ったパラメータの取得
今回はGinのパラメータを取得方法について書いていきます。 取得するパラメータの種類として、パスの中にあるIDやクエリーストリング、フォームのパラメータについてここでは解説しています。 パスにあるパラメータの取得 URIの中で指定したIDな ...続きを見る