Scala 从Specs2调用时操作上的ClassCastException

Scala 从Specs2调用时操作上的ClassCastException,scala,playframework,specs2,Scala,Playframework,Specs2,我正在play_2.9.1-2.0.3上构建一个应用程序,并使用规范2_2.9.1-1.7.1进行测试(与play捆绑在一起)。我有一个动作如下所示: def createPoll() = Action { request => request.body.asJson.map {jsonBod => Poll.fromJsonValue(jsonBod).fold( thrown => CommonResponses.invali

我正在play_2.9.1-2.0.3上构建一个应用程序,并使用规范2_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))
}
import play.api.libs.json.Json.parse

FakeRequest(
        PUT, controllers.routes.PollController.createPoll().url,
        FakeHeaders(),
        AnyContentAsJson(parse("{\"userId\":\"%s\",\"title\":\"%s\"}".format(userId, title)))
    )
当我从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 body解析器,但我希望能够使用specs,而不仅仅是curl进行测试。感谢操作上的apply方法采用
请求[AnyContent]=>结果
。FakeRequest的参数化类型是第四个参数的类型(请求主体)。考虑到这些,问题很明显:您试图将
请求[String]
作为输入传递给一个函数,该函数接受
请求[AnyContent]
。因此类强制转换异常。您只需使用
AnyContentAsJson
创建一个伪造请求(一个
AnyContent
的子类型)像这样:

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))
}
import play.api.libs.json.Json.parse

FakeRequest(
        PUT, controllers.routes.PollController.createPoll().url,
        FakeHeaders(),
        AnyContentAsJson(parse("{\"userId\":\"%s\",\"title\":\"%s\"}".format(userId, title)))
    )

Action上的apply方法接受一个
请求[AnyContent]=>结果
。FakerRequest的参数化类型是第四个参数(请求主体)的类型。考虑到这些,问题非常明显:您试图将
请求[String]
作为输入传递给接受
请求[AnyContent]的函数
。因此类强制转换异常。您只需使用
AnyContentAsJson
(AnyContent的子类型)创建一个伪请求,如下所示:

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))
}
import play.api.libs.json.Json.parse

FakeRequest(
        PUT, controllers.routes.PollController.createPoll().url,
        FakeHeaders(),
        AnyContentAsJson(parse("{\"userId\":\"%s\",\"title\":\"%s\"}".format(userId, title)))
    )

哦,这很有道理!非常感谢您的回复哦,这很有道理!非常感谢您的回复