I am using Gorilla mux and the net/http package to create some routes as follows
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") } I am trying to write a test to test these routes. For example, I am trying to test the GET route specifically trying to get a 400 returned so I have the following test code.
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) } } However, when I run this test, I get a 404 conceivably because the request is not being routed correctly.?
When I test this GET route from the browser, it does return a 400 so I'm certain there is an issue with the way the test is setup.
getQuestion. I've recreated your setup and implementedgetQuestionto be a no-op. When I rungo test ./...I get the following failure:routes_test.go:32: Server error: Returned 200 instead of 400.respRecinstead of making a new recorder withhttptest.NewRecorder(). I guess there is some restriction about reusing the same httpRecorder.