概要
Goのハンドラなどに対するHTTPのテストを行う際に、レスポンスのCookieの値を取り出す方法メモです。
事前知識
参考にした主な記事など
-
Go HTTPサーバについて
Go言語のHTTPサーバのテスト事始め - Qiita -
HTTPリクエスト/レスポンスについて
HTTPリクエスト/レスポンスの構成要素を初心者にも分かるように解説してみた - Qiita -
Go テスト
Go 言語 testing チートシート - Qiita
内容
Cookieを返すだけのHogeHandler
関数に対して、Cookieの値を取得して表示するテストを書きます。
package main
import (
"net/http"
)
func HogeHandler(w http.ResponseWriter, r *http.Request) error {
http.SetCookie(w, &http.Cookie{
Name: "hoge",
Value: "hogevalue",
})
return nil
}
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestHogeHandler(t *testing.T) {
req := httptest.NewRequest("GET", "/", nil)
resp := httptest.NewRecorder()
HogeHandler(resp, req)
// ここでCookieをパースする
parser := &http.Request{Header: http.Header{"Cookie": resp.Header()["Set-Cookie"]}}
hogeCookie, _ := parser.Cookie("hoge")
t.Log(hogeCookie.Value)
}
Cookie取得部分では、http.Requestを経由してCookie関数を利用することで、Cookieをパースして取得することができます。
本音を言うとhttptest.ResponseRecorderにCookie関数があってほしい...笑
ちなみにパースする必要がないならresp.Header()["Set-Cookie"]
で取得できます。
※ HeaderMap
関数は非推奨になったらしいです。
実行&出力
テスト実行
$ go test -v path/to/dir
出力結果
=== RUN TestHogeHandler
--- PASS: TestHogeHandler (0.00s)
main_test.go:17: hogevalue
PASS
参考
Jonny Reeves – Testing Setting HTTP Cookies in Go
http - The Go Programming Language
httptest - The Go Programming Language
testing - The Go Programming Language
最後に
記事に間違いや不明な点があれば遠慮なくご指摘ください。