首页 > 解决方案 > 模拟在 Golang Http Hander 中调用的函数

问题描述

我有一个需要测试的功能,如下所示:

func parmHandler(w http.ResponseWriter, r *http.Request) {
   ...
   data, err = backenddb_call(r *http.Request)
   ...
   return
}


function backenddb_call(r *http.Request) (data []Data, err error){
   parm := r.URL.Query().Get(parm)
   //Get Data from DB for parm 
   ...
   return
}

在这个 HTTP 处理程序案例中,我无法修改parmHandler参数并添加辅助接口参数来帮助模拟。如何模拟 backenddb_call 以返回不同的响应?

标签: gomocking

解决方案


您可以有一个返回处理程序的函数,您可以将其backenddb_call作为参数传递给:

https://play.golang.org/p/aSMxeEgJL8U

func GetHandler(fn func (r *http.Request) ([]Data, error)) http.Handler {
    return http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) {
        data, err := fn(r)
        fmt.Println(data, err)
    })
}

然后,当您创建它时:

http.HandleFunc("/test", GetHandler(backenddb_call))

为了测试它,你可以传入一个不同的调用:

GetHandler(func (r *http.Request) ([]Data, error) {
    fmt.Println("Mock")
    return []Data{"This", "Is", "A", "Fake", "Response"}, nil
})

推荐阅读