1

アクション構成を使用してコントローラー アクションをテストしたいと考えています。構成されたアクションとそのテスト コードの例を次に示します。

Secured トレイト:

trait Secured {
   def username(request: RequestHeader) = request.session.get(Security.username)
   def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Auth.login)

   def withAuth(f: => String => Request[AnyContent] => Result) = {
      Security.Authenticated(username, onUnauthorized) { user =>
        Action(request => f(user)(request))
   }
}

コントローラー:

MyController extends Contrller with Secured {
   def simple = Action { Ok("ok") }
   def simpleWithauth = withAuth { implicit username => implicit request=> Ok("ok") }
}

テストコード:

// This work fine
val result1 = controller.simple()(FakeRequest())

// This wont compile
val result2 = controller.simpleWithAuth()(FakeRequest())

後者はRequest[Action[AnyContent], AnyContent]を必要としますが、FakeRequest はRequest[AnyContent] を返します

適切なタイプの偽のリクエストを作成する方法についての指針はありますか?

4

2 に答える 2

3

これは、保護されたアクションをテストするために私がしなければならなかったことです

def wrappedActionResult[A](wrapped: Action[(Action[A], A)], request: Request[A]): Result = wrapped.parser(request).run.await.get match {
  case Left(errorResult) => errorResult
  case Right((innerAction, _)) => innerAction(request)
}

そしてテスト

    running(app) {
      val result = wrappedActionResult(FakeController().securedAction, invalidRequest)
      status(result) must_== UNAUTHORIZED
      contentAsString(result) must_== "must be authenticated"
    }

Play 2.1 では動作しませんが、型が変更されています...

更新: Play 2.1 ではさらに簡単になりました

砂糖を少し入れました

implicit class ActionExecutor(action: EssentialAction) {
  def process[A](request: Request[A]): Result = concurrent.Await.result(action(request).run, Duration(1, "sec"))
}

テストは次のようになります

  running(app) {
    val result = FakeController().securedAction process invalidRequest
    status(result) must_== UNAUTHORIZED
    contentAsString(result) must_== "must be authenticated"
  }

更新:これは私が以前に書いた関連ブログ投稿です http://www.daodecode.com/blog/2013/03/08/testing-security-dot-authenticated-in-play-2-dot-0-and- 2-ドット-1/

于 2013-02-14T18:55:00.843 に答える
0

routeAndCall アプローチを使用してみましたか?

val Some(result) = routeAndCall(FakeRequest(POST, "/someRoute"))

asFormUrlEncodedBody メソッドを使用してリクエストに必要なパラメーターを追加したり、withSession メソッドを使用してセッションに何かを追加したりできます。

于 2012-11-13T15:27:06.383 に答える