如何在echo中使用自定义上下文正确测试处理程序?

时间:2018-08-13 16:56:39

标签: go go-echo

我在自定义上下文中使用 echo 框架:

csplit

我的中间件:

ApiContext struct {
    echo.Context
    UserID   int64
    UserRole string
}

我的处理程序:

e.Use(func(h echo.HandlerFunc) echo.HandlerFunc {
    return func(c echo.Context) error {
        cc := &common.ApiContext{c, 0, ""}
        return h(cc)
    }
})

我的测试:

func (app *App) listEntity(c echo.Context) error {

    ctx := c.(*ApiContext) // error!
....
}

我收到此错误:

  

panic:接口转换:echo.Context是* echo.context,不是   * common.ApiContext

在处理程序函数类型声明中

如何正确编写测试? ps。这种方法很好用。

2 个答案:

答案 0 :(得分:1)

因此,当该方法可能出现紧急情况时,它并不是很好。您可以非常简单地捕获该错误:

ctx, ok := c.(*ApiContext) 
if !ok {
  // do something when you have a different type
  // return an error here
}

我认为您不应该使用与echo.Context不同的上下文,因为仅在该上下文中才支持测试。

但是回到您的问题。如果要使用上下文进行测试,则需要将上下文而不是echo.Context传递到测试中。

答案 1 :(得分:0)

之前:

if assert.NoError(t, EntityList(c)) {
    assert.Equal(t, http.StatusOK rec.Code)
}

之后(按原样放在您的自定义上下文中):

if assert.NoError(t, EntityList(&common.ApiContext{c, 0, ""})) {
    assert.Equal(t, http.StatusOK rec.Code)
}

但是,使用标准的context.Context是更好的做法。