はじめに
最近GoのPOSTに関する記事を挙げていました。
やっと初めて作成したAPIがテスト段階に移り、POSTのテストを書いていたのですがテストでPOSTにどのようにデータを渡すのかに時間をとられたのでまとめます
問題
今回はフォームデータをPOSTするテストを書いていました
以下のようなコードを書いたのですが、ginでc.params
で値を取得しても値がありませんでした
bodyで渡していたのでそれをform-dataで送る必要がありました
controller_test.go
jsonBody := []byte(`{"content":"hoge","done":false}`)
req, _ := http.NewRequest("POST", "/task", bytes.NewBuffer(jsonBody))
解決方法
以下のようにform-dataを作成してPOSTすることでうまくいきました
controller_test.go
(省略)
form := url.Values{}
form.Add("email", email)
form.Add("password", pass)
body := strings.NewReader(form.Encode())
w := httptest.NewRecorder()
req, _ := http.NewRequest(http.MethodPost, "/api/test/signup", body)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
r.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
またポイントとしては
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
を追加しないとエラーが出てしまうというところでした
おわりに
いままであまり意識していませんでしたが、データの送り方も大事です
そしてtestifyが便利だなととても思いました
参考