大まかなテストの流れ
- 擬似リクエストを作る
- レスポンスを受け取るRecorderを作る
- アサーションで結果を比較する。
以下記事よりstatusCodeとhttptestの値を確認した。
例)http.StatusCreated === 201
疑似リクエスト作成方法
httptest.NewRequest(
http.MethodPost, // 形式
"/user", // エンドポイント
bytes.NewBuffer([]byte(body)) // 引数に必要ならいれる、不要ならnil(body)
)
// 第3引数はio.Reader型である。
func NewRequest(method, url string, body io.Reader) (*Request, error) {
return NewRequestWithContext(context.Background(), method, url, body)
}
io.Reader型とは?
バイト列を読み出すためのインターフェース
// 具体的なio.Reader interface
// たったこれだけ。
type Reader interface {
Read(p []byte) (n int, err error)
}
// bytes.Buffer型はio.Reader型とio.Writer型を満たす
// Buffer構造体はReadメソッド、Writeメソッドを持っている。
// WriteメソッドはBuffer自らのbyteに書き込むためのメソッド
// ReadメソッドはBuffer自らのbyteを読み取るためのメソッド
func Buffer struct {
byte []
}
func (r *Buffer) Write(x) {
r.byte = x
}
func (r *Buffer) Read(x)(Buffer){
return r.byte
}
jsonへのEncodeをstream処理で行う
e := json.NewEncoder(w) // w = io.Writer
data := map[string]interface{}{
"name": "example",
"email": "example@gmail.com",
}
e.Encode(data)
encodeしたデータで新しいリクエストを作成する
// NewRequestに渡すio.Reader型を持った変数を定義する
// bytes.Bufferやbufio.Readerなどがあるので適当に作って渡せばいい
var buf bufio.Reader
req := httptest.NewRequest(http.~, "エンドポイント", &buf)