Тестирование HTTP-маршрутов в Голанге

Я использую 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 поэтому я уверен, что есть проблема с настройкой теста.

1 ответ

Решение

Использование init() здесь подозрительно. Он выполняется только один раз как часть инициализации программы. Вместо этого возможно что-то вроде:

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 с другими тестами, что, вероятно, загрязняло результаты ваших тестов.

Если вам нужна среда тестирования, которая предоставляет больше возможностей, таких как установка / демонтаж, см. Такие пакеты, как gocheck.

Другие вопросы по тегам