1

私はplay_2.9.1-2.0.3でアプリケーションを構築し、 specs2_2.9.1-1.7.1(playにバンドルされています)でテストしています。次のようなアクションがあります。

def createPoll() = Action { request =>
    request.body.asJson.map {jsonBod =>
        Poll.fromJsonValue(jsonBod).fold(
            thrown => CommonResponses.invalidCreatePollRequest(this),
            poll => (CommonResponses.createdPoll(poll, this))
    )}.getOrElse(CommonResponses.expectingJson(this))
}

これは、curlからメッセージを送信すると期待どおりに機能しますが、specs2テストで次の例外が発生します。

ClassCastException: java.lang.String cannot be cast to play.api.mvc.AnyContent(PollController.scala:16)

ここで、16行目は次のとおりです。

def createPoll() = Action { request =>

テストの関連部分は次のとおりです。

    routeAndCall(
        FakeRequest(
            PUT, controllers.routes.PollController.createPoll().url,
            FakeHeaders(),
            "{\"userId\":\"%s\",\"title\":\"%s\"}".format(userId, title)
        ).withHeaders(("Content-type", "application/json"))
    )

createPolldefを次のように変更した場合:def createPoll() = Action(parse.tolerantText) {

次に、specs2テストから機能させることができます。

誰かが私が間違っていることを知っていますか?理想的には、parse.jsonボディパーサーを使用したいのですが、テストのためにカールするだけでなく、スペックを使用できるようにしたいのです。ありがとう

4

1 に答える 1

1

アクションのapplyメソッドは。を取りますRequest[AnyContent] => Result。FakeRequestのパラメーター化されたタイプは、4番目のパラメーター(リクエストの本体)のタイプです。Request[String]これらを考えると、問題は非常に明白です。を受け取る関数への入力としてを渡そうとしているのRequest[AnyContent]です。したがって、クラスキャスト例外。あなたがする必要があるのは、次のようなAnyContentAsJson(AサブタイプのAnyContent)でFakeRequestを作成することです:

import play.api.libs.json.Json.parse

FakeRequest(
        PUT, controllers.routes.PollController.createPoll().url,
        FakeHeaders(),
        AnyContentAsJson(parse("{\"userId\":\"%s\",\"title\":\"%s\"}".format(userId, title)))
    )
于 2012-10-29T01:44:06.043 に答える