2017-04-07 11 views
0

echoフレームワーク/ルータで構築されたgolang APIをテストしようとしています。私は次のテストを持っている..... echo c.Get( "user")がテストで動作しないenv [echo middleware testing]

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( "user")はlive envと同じようにテストで動作しません)。

+0

それは誰にどんな助けがある場合、また、エコーJWTミドルウェアhttps://echo.labstack.com/cookbook/jwt –

+0

を使用して、デフォルトのアクセス方法があります。 Log.Println(c.Request()。Header)は、テストのヘッダー情報を持っていますか?c.Get()によってアクセスできないですか? –

答えて

0

私はこれを理解することができました。ここに作業コードがあります。説明は以下のとおりです。私はきちんと私のヘッダーを設定していたが、私のトークンが検証され、c.Get()コマンドを使用してaccesisibleなされていなかったことを意味JWTエコーミドルウェアを実行していませんでした

 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) 
     } 

    }) 

ここで重要な点は、サーバーを実行せずにエコーミドルウェアをテストするには、ミドルウェア機能を実行する必要があります。次に、ハンドラ機能(これはテストする機能です)を受け取り、コンテキストを取得します。したがって、関数はミドルウェアのルートをテストするために次のようになります。すべて大文字であれば、あなたの特定の場合に置き換える必要があります。

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) 
関連する問題