Scala 从Specs2调用时操作上的ClassCastException
我正在play_2.9.1-2.0.3上构建一个应用程序,并使用规范2_2.9.1-1.7.1进行测试(与play捆绑在一起)。我有一个动作如下所示: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
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)))
)
哦,这很有道理!非常感谢您的回复哦,这很有道理!非常感谢您的回复