模拟一个在Golang Http Hander中调用的函数

时间:2019-02-28 18:35:42

标签: go mocking

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

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返回不同的响应?

1 个答案:

答案 0 :(得分:1)

您可以有一个返回处理程序的函数,您可以将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
})