LoginSignup
11
9

More than 5 years have passed since last update.

Goのhttpモック用モジュールを作ってみた

Last updated at Posted at 2014-12-19

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の向き先を変えなければいけないから)。
なので、本当はリファクタリングしたいけれど、出来ないとき用のものが欲しかった。

11
9
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
11
9