如何用gomock一个gin.Context
Context的概念
程序里面所谓的“Context”就是程序的执行环境,打个比方:你有家吧?如果家都没有就别学编程了,租的也行啊!你就相当于web程序,家就相当于web程序的上下文,你可以在家里放东西,也可以取东西,你的衣食住行都依赖这个家,这个家就是你生活的上下文环境。
context就是“容器”,放的就是应用程序的所有资源,要用时候就访问它,所以context里面的东西,在同一个应用程序里面是全局的;web上下文可以看成web应用的运行环境,一般用context名字来修饰,里面保存了web应用相关的一些设置和全局变量.
gin.Context的定义
type Context struct {
// responseWriter对ResponseWriter封装
writermem responseWriter
// http请求及响应writer
Request *http.Request
Writer ResponseWriter
// 键值对切片类型
Params Params
……
}
- gin.Context中只封装了Request
- Param 是单个 URL 参数,由一个键和一个值组成。
mock一个gin.Context并添加参数
ctl := gomock.NewController(testing.T)
defer ctl.Finish()
w := httptest.NewRecorder()
c, _ := gin.CreateTestContext(w)
c.Params = []gin.Param{gin.Param{Key: "k", Value: "v"}}
-
gomock.NewController:返回
gomock.Controller
,它代表 mock 生态系统中的顶级控件。定义了 mock 对象的范围、生命周期和期待值。另外它在多个 goroutine 中是安全的 -
ctl.Finish():进行 mock 用例的期望值断言,一般会使用
defer
延迟执行,以防止我们忘记这一操作 -
httptest.NewRecorder():创建响应记录器,以便您可以检查响应。
-
调用EXPECT()为你的mock对象设置各种期望和返回值。
-
mock***.EXPECT().Get(id).Return(nil):
? 这里有三个步骤,
EXPECT()
返回一个允许调用者设置期望和返回值的对象。Get(id)
是设置入参并调用 mock 实例中 的方法。Return(nil)
是设置先前调用的方法出参。简单来说,就是设置入参并调用,最后设置返回值 -
Params 是一个 Param切片,由路由器返回。切片是有序的,第一个 URL 参数也是第一个切片值。因此,通过索引读取值是安全的。