如何在 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
是更好的做法。
我将 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
是更好的做法。