我正在使用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返回的路由,因此我有以下测试代码。
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可以想象得到是因为请求未正确路由。
404
当我从浏览器测试此GET路由时,它确实返回,400因此我确定测试的设置方式存在问题。
在这里使用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之类的软件包。