2017-04-07 90 views
0

我正在尝试测试构建在echo框架/路由器上的golang API。我有以下的测试.....echo c.Get(“user”)在测试env时不起作用[echo中间件测试]

func TestLogout(t *testing.T) { 
loadConfig() 
db := stubDBs(t) 
Convey("When you post to /logout", t, func() { 
    Convey("with a valid token, you should get aa success msg and be logged out", func() { 
     e := echo.New() 
     e.Use(middleware.JWTWithConfig(middleware.JWTConfig{ 
      SigningKey: []byte("secret"), 
      TokenLookup: "query:user", 
     })) 
     req, err := http.NewRequest(echo.POST, "auth/logout", strings.NewReader("")) 
     if err == nil { 
      req.Header.Set(echo.HeaderAuthorization, fmt.Sprintf("Bearer %v", Token)) 
      rec := httptest.NewRecorder() 
      c := e.NewContext(req, rec) 
      Logout(db, Models.Redis)(c) 
      body := GetJsonBody(rec.Body.String()) 
      error := body.Path("error").Data() 
      msg := body.Path("error").Data().(string) 
      pw := body.Path("data.user.password").Data().(string) 
      token := body.Path("data.user.token").Data() 
      So(error, ShouldEqual, nil) 
      So(msg, ShouldEqual, "Logged Out") 
      So(rec.Code, ShouldEqual, 200) 
      So(pw, ShouldEqual, "") 
      So(token, ShouldEqual, nil) 
     } 

    }) 
}) 
} 

,并在控制器....

//Logout ... 
func Logout(db *sqlx.DB, r *redis.Client) echo.HandlerFunc { 
    return func(c echo.Context) error { 
     var user Models.User 
     log.Println(c.Get("user")) //<-----This Logs NIL only on testing 
     if c.Get("user") == nil { 
      res := createAuthErrorResponse(user, "Invalid Token") 
      return c.JSON(http.StatusOK, res) 
     } 
     token := c.Get("user").(*jwt.Token) 
     err := Models.Redis.Del(token.Raw).Err() 
     if err != nil { 
      handleErr(err) 
      res := createAuthErrorResponse(user, "Token not in storage") 
      return c.JSON(http.StatusOK, res) 
     } 
     user.Password = "" 
     user.Token = null.StringFrom("") 
     res := createAuthSuccessResponse(user, "Logged Out.") 
     return c.JSON(http.StatusOK, res) 
    } 
} 

我如何能测试在町框架这个功能有什么建议?这是我不希望的行为(c.Get(“用户”)在测试中的行为与现场环境中的行为不同)。

+0

它是使用echo JWT中间件https://echo.labstack.com/cookbook/jwt –

+0

另外,如果是任何人任何帮助的缺省访问方法。 log.Println(c.Request()。Header)测试中是否有头文件信息,是否只能通过c.Get() –

回答

0

经过很多的痛苦,我才弄清楚了这一点。这是工作代码。下面的解释。

 Convey("with a valid token, you should get a success msg and be logged out", func() { 
     e := echo.New() 
     req, err := http.NewRequest(echo.POST, "auth/logout", strings.NewReader("")) 
     if err == nil { 
      req.Header.Set(echo.HeaderAuthorization, fmt.Sprintf("Bearer %v", Token)) 
      rec := httptest.NewRecorder() 
      c := e.NewContext(req, rec) 
      middleware.JWTWithConfig(middleware.JWTConfig{ 
       SigningKey: []byte("secret"), 
      })(Logout(db, Models.Redis))(c) 
      body := GetJsonBody(rec.Body.String()) 
      error := body.Path("error").Data() 
      msg := body.Path("msg").Data().(string) 
      pw := body.Path("data.user.password").Data().(string) 
      token := body.Path("data.user.token").Data() 
      So(error, ShouldEqual, nil) 
      So(msg, ShouldEqual, "Logged Out") 
      So(rec.Code, ShouldEqual, 200) 
      So(pw, ShouldEqual, "") 
      So(token, ShouldEqual, nil) 
     } 

    }) 

我已经适当地设置我的头,但没有执行JWT回声中间件这意味着我的令牌不被验证和accesisible使用c.Get()命令所做的。

这里的关键在于测试echo middlware而不运行服务器需要您执行中间件功能,然后该中间件功能需要处理函数(这是您要测试的函数),然后使用上下文。所以,函数应该看起来如下来测试你的中间件路由。如果是全部大写,则需要将其替换为特定的大小写。

A: middleware.MIDDLEWARE_FUNC(NECESSARY_CONFIGS) // <--- this returns echo.MiddlewareFunc 

B: (YOUR_HANDLER(req, res)) // <---echo.MiddlewareFunc takes an echo.HanlderFunc as its only argument and you pass your handler you test req, res 

(c) // <--Finally, you call the resulting compose function with your test context 

A(B())(c)