我正在 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进行测试。感谢
答案 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)))
)