为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中测试 HTTP 路由

在 Golang 中测试 HTTP 路由

Go
慕尼黑5688855 2021-08-10 15:34:10
我正在使用 Gorilla mux 和 net/http 包来创建一些路由,如下所示package routes//some imports//some stufffunc 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 importsvar m *mux.Routervar req *http.Requestvar err errorvar respRec *httptest.ResponseRecorderfunc 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 路由时,它确实返回了 a,400所以我确定测试的设置方式存在问题。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

在这里使用 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等软件包。


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信