1

我使用带有自定义上下文的回声框架:

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

在处理函数类型断言中

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

4

2 回答 2

3

所以方法不是很好,当它可以恐慌时。您可以非常简单地发现该错误:

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

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

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

于 2018-08-13T19:27:48.923 回答
0

前:

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

于 2019-12-19T03:14:38.013 回答