github.com/hiroosak/gomock - GoDoc
ソースに一行追加するだけですべての HTTP 通信をロギングするモジュールを書いた #golang をみて、Transport
を実装すれば、リクエストを行う前に処理を挟めることを知ったので試しに書いてみた。
main.go
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"github.com/hiroosak/gomock"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/me", func(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.WriteHeader(200)
fmt.Fprintf(w, "Request OK")
})
transport := gomock.NewTransport()
transport.Stub("graph.facebook.com", mux)
client := &http.Client{
Transport: transport,
}
resp, err := client.Get("https://graph.facebook.com/me")
if err != nil {
log.Fatal(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body)) // Response OK
}
http.DefaultTransport
を書き換えれば、どんなリクエストでもチェックできる。
http.DefaultTransport = transport
defer gomock.ResetDefaultTransport() // 処理終わったら初期化
client := &http.Client{}
RoundTrip
内でtransport.Stub()
でリクエストのURLがマッチした場合に、net/http/httptestを立ち上げてそっちを参照するようにしている。
どんなときに使うのか
通常のサーバーへのリクエストをテストで行う場合は、net/http/httptestを使うべき。
だけど、その場合URLをテストコード側から自由に設定できるようにしておく必要がある(リクエストURLの向き先を変えなければいけないから)。
なので、本当はリファクタリングしたいけれど、出来ないとき用のものが欲しかった。