2016-12-09 1 views
0

私はカスタムbodyparserとJSONバリデータを使用してプレイフレームワーク2.5.10コントローラをテストしようとしている:私はこの上の簡単なテストケースを実行すると、私はエラーを取得するカスタムボディーパーサーを使用するプレーフレームワークコントローラーをテストするにはどうすればよいですか?

class MessagingController { 
    def validateJson[A : Reads] = parse.json.validate(
    _.validate[A].asEither.left.map(e => BadRequest(JsError.toJson(e))) 
) 
    def createMessageThread() = Action(validateJson[InboundMessageThread]) { request => 
    Ok("OK") } 
    } 

を:

For request 'POST /api/v1/messageThreads' [Invalid Json: No content to map due to 
end-of-input at [Source: [email protected]; line: 1, column: 0]] 

テストは次のとおりです。

val fakeRequest = FakeRequest() 
     .withHeaders(HeaderNames.CONTENT_TYPE -> "application/json") 
     .withBody(Json.parse(
     s""" 
      |{ 
      | "participants": [ 
      | {"id": $currentUserId, "isAdmin": false} 
      | ], 
      | "isGroupThread": false 
      |} 
    """.stripMargin)) 

    val result = messagingController.createMessageThread()(fakeRequest).run() 
    status(result) mustBe OK 

私はちょうどAction、その後、コントロールの本体でJSONを検証するために、コントローラのアクションを変更した場合それがうまくいけば多くのRESTコントローラがJSONを解析して使用する必要があり、validateJson[T]が定型文を減らすので、私はそれをやりたくありません。このコードは、同じペイロードをカールを使用して送信する場合にも機能します。

このコントローラをテストするにはどうすればよいですか?

答えて

0

要求の次の並べ替えは動作します:

val request = FakeRequest() 
    .withHeaders(CONTENT_TYPE -> "application/json") 
    .withBody(Json.fromJson[Place](body).get) 
0

これは

val postRequest = FakeRequest(POST, "/route/to/hit").withJsonBody(Json.obj(
    "participants" -> Json.arr(Json.obj("id" -> "currentUserId", "isAdmin" -> false)), 
    "isGroupThread" -> false 
)) 

    val result = await(messagingController.createMessageThread()(postRequest)) 

    status(result) must be equalTo (FORBIDDEN) 
+0

これは '415が403と等しくない 'ことを示します。私が 'withHeaders'呼び出しを追加すると、前と同じように' 400は403と等しくない 'になります。 – jbrown

0

ではなくJSONのbodyparserでアクションを呼び出すことができます願って、私はAnyContentボディパーサーを使用してActionBuilderでそれを呼び出した後、内部からJson.validateを呼び出すことをお勧めしたい、これを試してみてくださいボディ - そこから、あなたはスタックトレースを取得し、失敗しているものを参照してください。

class MessagingController {  
    def createMessageThread() = Action { request => 
    request.json.validate[MessageThread] { 
     case JsError(e) =>   
     logger.error(s"Failure parsing because $e") 
     BadRequest(JsError.toJson(e)) 
     case JsSuccess(e) =>  
     Ok("OK") 
    } 
    } 
} 
+0

これは良い考えです。しかし、これは "OK"を返します。 'def createMessageThread()= Action(parse.json)'でJSONボディーパーサーを追加すると、再び失敗します。カスタムボディパーサーを使用するテストをどのように作成する必要がありますか? – jbrown

+0

OK 'Action(parse.json)'を使って動作させていますが、 'Action.async(validateJson [InboundMessageThread]) 'を使って検証すると失敗します。私は私の質問を修正します... – jbrown

関連する問題