如何用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 参数也是第一个切片值。因此,通过索引读取值是安全的。