ゴンの気まぐれなるままに
Go

Golang Ginを使ったユニットテスト

Gin ユニットテスト

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フレームワークで、ユニットテストを行いました。

途中でエラーとかのトラブルとかありましたが、ちゃんと実行出来たと思います。