12

Gorilla mux と net/http パッケージを使用して、次のようにいくつかのルートを作成しています

package routes

//some imports

//some stuff

func AddQuestionRoutes(r *mux.Router) {
    s := r.PathPrefix("/questions").Subrouter()
    s.HandleFunc("/{question_id}/{question_type}", getQuestion).Methods("GET")
    s.HandleFunc("/", postQuestion).Methods("POST")
    s.HandleFunc("/", putQuestion).Methods("PUT")
    s.HandleFunc("/{question_id}", deleteQuestion).Methods("DELETE")
}

これらのルートをテストするテストを作成しようとしています。たとえば、GET特に返されたルートをテストしようとし400ているので、次のテストコードがあります。

package routes

//some imports

var m *mux.Router
var req *http.Request
var err error
var respRec *httptest.ResponseRecorder

func init() {
    //mux router with added question routes
    m = mux.NewRouter()
    AddQuestionRoutes(m)

    //The response recorder used to record HTTP responses
    respRec = httptest.NewRecorder()
}

func TestGet400(t *testing.T) {
    //Testing get of non existent question type
    req, err = http.NewRequest("GET", "/questions/1/SC", nil)
    if err != nil {
        t.Fatal("Creating 'GET /questions/1/SC' request failed!")
    }

    m.ServeHTTP(respRec, req)

    if respRec.Code != http.StatusBadRequest {
        t.Fatal("Server error: Returned ", respRec.Code, " instead of ", http.StatusBadRequest)
    }
}

ただし、このテストを実行する404と、リクエストが正しくルーティングされていないことが原因であると考えられます。

この GET ルートをブラウザからテストすると、 が返される400ので、テストのセットアップ方法に問題があると確信しています。

4

1 に答える 1

9

ここでの init() の使用は疑わしいです。プログラムの初期化の一部として 1 回だけ実行されます。代わりに、おそらく次のようになります。

func setup() {
    //mux router with added question routes
    m = mux.NewRouter()
    AddQuestionRoutes(m)

    //The response recorder used to record HTTP responses
    respRec = httptest.NewRecorder()
}

func TestGet400(t *testing.T) {
    setup()
    //Testing get of non existent question type
    req, err = http.NewRequest("GET", "/questions/1/SC", nil)
    if err != nil {
        t.Fatal("Creating 'GET /questions/1/SC' request failed!")
    }

    m.ServeHTTP(respRec, req)

    if respRec.Code != http.StatusBadRequest {
        t.Fatal("Server error: Returned ", respRec.Code, " instead of ", http.StatusBadRequest)
    }
}

ここで、適切な各テスト ケースの最初に setup() を呼び出します。元のコードは同じ respRec を他のテストと共有していたため、テスト結果が汚染された可能性があります。

setup/teardown フィクスチャなどの追加機能を提供するテスト フレームワークが必要な場合は、gocheckなどのパッケージを参照してください。

于 2014-08-30T18:17:37.427 に答える