第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何動態(tài)更改方法接收器

如何動態(tài)更改方法接收器

Go
猛跑小豬 2022-10-04 15:50:27
我最近了解到你可以在go中做到這一點:type Env struct{}func (e *Env) httpHandler(w http.ResponseWriter, r *http.Request) {   //...}func main() {    // ...    e := &Env{}    router := mux.NewRouter()    router.HandleFunc("/foo", e.httpHandler)}這對于依賴注入非常有用,因為當我進行單元測試時,我可以簡單地調(diào)用模擬env。httpHandler但是,我的問題是...假設(shè)您有:method := e.httpHandler有沒有辦法在已經(jīng)存儲到反射或其他東西之后動態(tài)更改接收器的值?我可以更改傳入的參數(shù),但似乎接收器值已鎖定,更改接收器的唯一方法是執(zhí)行 。在我的情況下,這是不可能的,因為我是從多路復用器路由器中提取的,我只想在呼叫之前換出不同的接收器。ee.httpHandlermethodmethod()e2.httpHandlere.httpHandlerehttpHandler對于更多的上下文,我基本上用來做表驅(qū)動的測試,其中我循環(huán)訪問每個路由,調(diào)用處理程序,檢查返回的響應是否是正確的形狀,等等。但是,某些路由需要的數(shù)據(jù)庫模擬與其他路由略有不同,因此對路由器中的所有路由使用一刀切的模擬接收器并不理想。我想將處理程序接收器與選定處理程序的自定義模擬環(huán)境動態(tài)交換。router.Walk()
查看完整描述

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

    })

}


查看完整回答
反對 回復 2022-10-04
?
元芳怎么了

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)


查看完整回答
反對 回復 2022-10-04
  • 2 回答
  • 0 關(guān)注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號