2 回答

TA貢獻1891條經(jīng)驗 獲得超3個贊
這是我的想法。你覺得怎么樣?
type Env struct{
db string // should be database, just example
}
func (e *Env) httpHandler(w http.ResponseWriter, r * http.Request) {
}
// In case, create different router by different database.
func newRouter(db string) *mux.Router {
e := &Env{
db:db,
}
router := mux.NewRouter()
router.HandleFunc("/foo", e.httpHandler)
router.HandleFunc("/bar", e.httpHandler)
return router
}
func TestByDatabaseA(t *testing.T) {
r := newRouter("foo")
r.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
tpl, _ := route.GetPathTemplate()
if !strings.HasPrefix(tpl,"/foo"){
return nil
}
// run test
return nil
})
}
func TestByDatabaseB(t *testing.T) {
r := newRouter("bar")
r.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
tpl, _ := route.GetPathTemplate()
if !strings.HasPrefix(tpl,"/bar"){
return nil
}
// run test
return nil
})
}

TA貢獻1798條經(jīng)驗 獲得超7個贊
如果在測試套件的整個生命周期內(nèi)需要單個路由器 - 并且由于您無法更改指針接收器或重新注冊路由處理程序 - 則可以嘗試包裝以后可以更改處理程序函數(shù)的位置:HandlerFunc
type wrapperHandler struct {
Fn http.HandlerFunc
}
func (wh *wrapperHandler) HandlerFunc() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
wh.Fn.ServeHTTP(w, r) // can change `Fn` later
}
}
使用:
// setup
router := mux.NewRouter()
wh := wrapperHandler{} // fill in wh.Fn later
router.HandleFunc("/foo", wh.HandlerFunc())
e := Env{ /*db1*/ }
wh.Fn = e.httpHandler
runTest(router)
e = Env{ /*db2*/ }
wh.Fn = e.httpHandler
runTest(router)
- 2 回答
- 0 關(guān)注
- 100 瀏覽
添加回答
舉報