如何在 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)

    }

}

我收到这个错误:


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


在处理程序函数类型断言中


如何正确编写测试?附言。这种方法工作正常。


千巷猫影
浏览 152回答 2
2回答

慕无忌1623718

所以这个方法不是很好,什么时候可以panic。您可以非常简单地捕获该错误:ctx, ok := c.(*ApiContext) if !ok {  // do something when you have a different type  // return an error here}我认为您不应该使用不同的上下文echo.Context,因为只有使用该上下文才能支持测试。但回到你的问题。如果你想用你的上下文来测试它,你需要将你的上下文传递给测试而不是echo.Context.

Smart猫小萌

前: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是更好的做法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go