net/httpのシンプルな関数をテストする
仮にこんな感じの定義があったとする。
code:main.go
import (
"strconv"
"net/http"
)
type dollars float32
func (d dollars) String() string { return fmt.Sprintf("$%.2f", d) }
type database mapstringdollars func (db database) update(w http.ResponseWriter, req *http.Request) {
item := req.URL.Query().Get("item")
priceStr := req.URL.Query().Get("price")
price, _ := strconv.ParseFloat(priceStr, 32)
req.WriteHeader(http.StatusOK)
}
/* こんな感じでつかう
func main() {
db := database{"shoes": 50, "socks": 5}
http.HandleFunc("/update", db.update)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
*/
テストは、httptest.NewRecorder()とhttptest.NewRequest()を使って書くとかんたん。
code: main_test.go
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestDBCreate(t *testing.T) {
db := database{"shoes": 50, "socks": 5}
// http.ResponseWriterを満たす
rec := httptest.NewRecorder()
// http.Requestを満たす
req := httptest.NewRequest("POST", "/update?item=shoes&price=40.5", nil)
// 普通にhandleする関数をcallする
db.create(rec, req)
// あとは普通に検証する
if rec.Code != http.StatusCreated {
t.Fatalf("Wrong HTTP status! expected: 200, got: %v(%v)", rec.Code, rec.Body)
}
if price, ok := db"shoes"; !ok || price != 40.5 { t.Fatalf("Wrong price of shirt! expected: 40.5, got: %f", float32(price))
}
}
もっと複雑なアプリケーションの場合は、このあたりを参考にすると良さそう。