Как правильно протестировать обработчик с пользовательским контекстом в 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
Лучшая практика.