gqlgenを使ったアプリのテストコードを書くときに transport not supported で嵌った話

3 min読了の目安(約2300字TECH技術記事

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 つけるのを忘れないようにしましょう!