🙄
gqlgenを使ったアプリのテストコードを書くときに transport not supported で嵌った話
gqlgen のチュートリアルで作ったアプリに対してテストコードを書いてみた
以下がテストコード
package graph_test
import (
"bytes"
"context"
"encoding/json"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"github.com/99designs/gqlgen/handler"
"github.com/Konboi/gqlgen-todos/graph"
"github.com/Konboi/gqlgen-todos/graph/generated"
)
func TestCreateTodo(t *testing.T) {
ts := httptest.NewServer(
handler.GraphQL(
generated.NewExecutableSchema(
generated.Config{
Resolvers: &graph.Resolver{},
},
),
),
)
defer ts.Close()
q := struct {
Query string
}{
Query: "{todos {text}}",
}
body := bytes.Buffer{}
if err := json.NewEncoder(&body).Encode(&q); err != nil {
t.Fatal("error encode", err)
}
req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, ts.URL, &body)
if err != nil {
t.Fatal("error new request", err)
}
res, err := http.DefaultClient.Do(req)
if err != nil {
t.Fatal("error request", err)
}
defer res.Body.Close()
result, err := ioutil.ReadAll(res.Body)
if err != nil {
t.Fatal("error read body", err)
}
if res.StatusCode != http.StatusOK {
t.Fatal("error request code:", res.StatusCode, string(result))
}
t.Log(string(result))
}
テストを実行してみると
$ go test -v ./graph
=== RUN TestCreateTodo
schema.resolvers_test.go:56: error request code: 400 {"errors":[{"message":"transport not supported"}],"data":null}
--- FAIL: TestCreateTodo (0.00s)
FAIL
FAIL github.com/Konboi/gqlgen-todos/graph 1.773s
FAIL
と transport not supported
でリクエストが失敗する
このissueの修正のように
srv.AddTransport(transport.POST{})
を追加してみたが駄目だった
色々調べてみるとstack overflow のコメントを見つけた
application/json
header をつけないと駄目らしいので、「それが原因?! ほんとか?」と思いながらテストコードを修正してみた
リクエスト部分を以下のように修正
req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, ts.URL, &body)
if err != nil {
t.Fatal("error new request", err)
}
req.Header.Add("Content-Type", "application/json")
テストを実行してみると
$ go test -v ./graph
=== RUN TestCreateTodo
schema.resolvers_test.go:60: {"data":{"todos":[]}}
--- PASS: TestCreateTodo (0.00s)
PASS
ok github.com/Konboi/gqlgen-todos/graph 1.477s```
通った!!🎉
ということで実際にリクエストしてテストするときは application/json
つけるのを忘れないようにしましょう!
Discussion