go - 模拟在 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 以返回不同的响应?
解决方案
您可以有一个返回处理程序的函数,您可以将其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
})
推荐阅读
- bash - 将引号添加到 txt 文件中的每个 var
- c# - 无法将类型“Microsoft.AspNetCore.Mvc.NotFoundResult”隐式转换为“System.Threading.Tasks.Task”
- c# - 限制或撤销 Firebase 数据库机密 _to 停止从 C# 或 Asp.net 读取数据
- java - 基于双精度值的Java流排序对象
- ruby-on-rails - 如何设置 devise_for namespace::user
- go - 结构上的设置字段丢失?
- int - 等效于 Julia 中的 `int.bit_length()`
- javascript - 如何将请求重定向到 json-server 上的另一个 URL?
- php - 如何修复除root以外的任何用户的mysqli返回访问被拒绝
- c# - 在 task.factory.startnew() 中从另一种形式调用方法