golangでAPI開発してるとunitテストはもちろん書くけど
Rails Rspecみたいにrequestテスト(APIのレスポンス検証)もしたくなるよなー
goでやってみよう
package main
import (
"bytes"
"io/ioutil"
"net/http"
"testing"
)
func TestRequest(t *testing.T) {
var j = []byte(`
{
"id": "test"
}`)
url := "http://IPADDRESS/ENDPOINT"
//postrequest作成
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
//headerをセット
req.Header.Set("Content-Type", "application/json")
//httpクライアント
client := &http.Client{}
//実行
resp, err := client.Do(req)
if err != nil {
panic(err)
}
//body使わなくなったら閉じる
defer resp.Body.Close()
//エラー検証
if err != nil {
t.Error(err)
return
}
//ステータスコード確認
if resp.StatusCode != 200 {
t.Error(resp.StatusCode)
return
}
//レスポンスBODY取得
body, _ := ioutil.ReadAll(resp.Body)
actual := string(body)
expected := `{"id":"test-id-desuyo"}`
if actual != expected {
t.Error("response error")
}
return
}
こんな感じでhttp.Clinetを使えば実装できますよ!
本当はnet/http/httptestというやつもいてるけど、今回は使わずにやりました。