Как правильно протестировать обработчик с пользовательским контекстом в echo?

Я использую echo framework с пользовательским контекстом:

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 is *echo.context, а не *common.ApiContext

в утверждении типа функции обработчика

Как правильно написать тест? пс. этот метод работает нормально.

1 ответ

Решение

Так что метод не очень хорош, когда он может паниковать. Вы можете поймать эту ошибку очень просто:

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 Лучшая практика.

Другие вопросы по тегам