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

How to properly test handler with custom context in echo?

我将 echo 框架与自定义上下文一起使用:

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!
....
}

我的测试:

func TestlistEntity(t *testing.T){

    e := echo.New()

    req := httptest.NewRequest(echo.GET, "/", nil)
    rec := httptest.NewRecorder()
    c := e.NewContext(req, rec)
    c.SetPath("/api/v1/entity/list")


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

我收到这个错误:

panic: interface conversion: echo.Context is *echo.context, not *common.ApiContext

在处理函数类型断言中

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

所以方法不是很精,什么时候可以panic。您可以非常简单地捕获该错误:

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

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

但是回到你的问题。如果你想用你的上下文测试它,你需要将你的上下文传递给测试而不是 echo.Context.

之前:

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 是更好的做法。