14

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.

2
  • It's hard to say without seeing the code for getQuestion. I've recreated your setup and implemented getQuestion to be a no-op. When I run go test ./... I get the following failure: routes_test.go:32: Server error: Returned 200 instead of 400. Commented Aug 16, 2014 at 5:51
  • figured it out. I actually was running other test, but I was using the same respRec instead of making a new recorder with httptest.NewRecorder(). I guess there is some restriction about reusing the same httpRecorder. Commented Aug 16, 2014 at 10:27

1 Answer 1

10

The use of init() here is suspect. It only executes once as part of program initialization. Instead, perhaps something like:

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) } } 

where you call setup() at the beginning of each appropriate test case. Your original code was sharing the same respRec with other tests, which probably polluted your test results.

If you need a testing framework that provides more features like setup/teardown fixtures, see packages such as gocheck.

Sign up to request clarification or add additional context in comments.

2 Comments

Can you please show the AddQuestionRoutes(), can we add test specific routes only?
sorry, got it, its in the question itself

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.