ClassSastException从Specs2调用时的操作

时间:2012-10-29 01:14:02

标签: scala playframework specs2

我正在 play_2.9.1-2.0.3 上构建一个应用程序,并使用 specs2_2.9.1-1.7.1 (与游戏捆绑在一起)进行测试。我有一个看起来像这样的动作:

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

如果我将createPoll def更改为:def createPoll() = Action(parse.tolerantText) {

然后我可以通过specs2测试使其工作。

有谁知道我做错了什么?理想情况下我想使用parse.json身体解析器,但我希望能够使用规格而不仅仅是curl进行测试。感谢

1 个答案:

答案 0 :(得分:1)

Action上的apply方法需要Request[AnyContent] => Result。 FakeRequest的参数化类型是第四个参数(请求的主体)的类型。鉴于这些,问题非常明显:您试图将Request[String]作为输入传递给采用Request[AnyContent]的函数。因此类强制转换异常。您需要做的就是使用AnyContentAsJson(子类型为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)))
    )