如何在Play framework v2.x中不使用withJsonBody为FakereRequest发送json字符串正文?

如何在Play framework v2.x中不使用withJsonBody为FakereRequest发送json字符串正文?,json,scala,testing,playframework,playframework-2.0,Json,Scala,Testing,Playframework,Playframework 2.0,我已经玩了scala v2.3应用程序。我试图通过发送带有FakereRequest的json字符串来创建控制器测试,如下所示: class ApplicationSpec extends Specification { "Application" should { "Create Bob Test" in new WithApplication { val jsonStr = """{"text": "hi bob"}""" val result =

我已经玩了scala v2.3应用程序。我试图通过发送带有FakereRequest的json字符串来创建控制器测试,如下所示:

class ApplicationSpec extends Specification {

  "Application" should {

    "Create Bob Test" in new WithApplication {
      val jsonStr = """{"text": "hi bob"}"""

      val result = route(FakeRequest(POST, "/bob")
        .withHeaders("Content-Type" -> "application/json")
        .withBody(jsonStr)
      ).get

      status(result) === OK
    }
  }
}
控制员:

object Application extends Controller {

  def bob = Action.async { request =>
    println("request.headers: " + request.headers)
    println("request.body: " + request.body)
    println("request.body.asJson: " + request.body.asJson)

    request.body.asJson.map { json =>
      // do something with the json
      Future.successful(Ok)
    }.getOrElse(Future.successful(BadRequest))
  }

}
当我运行测试时,它失败了,下面是打印的内容:

request.headers: ArrayBuffer((Content-Type,List(text/plain; charset=utf-8)))
request.body: AnyContentAsText({"text": "hi bob"})
request.body.asJson: None
因此,发送的
Content-Type
标题不是
application/json
,尽管我已将标题设置为
application/json
。可能正因为如此,
request.body.asJson
不会返回任何结果

有人知道怎么解决这个问题吗


注意:我知道我可以在FakereRequest上使用
.withJsonBody(Json.parse(jsonStr))
,它会成功,但通过这种方式,我不能为负测试用例发送损坏或无效的Json字符串,因为
withJsonBody
接受JsValue,默认情况下,Json字符串必须首先用
Json.parse
转换,
内容类型
头被框架覆盖。中给出了解决方法

对你来说,这应该行得通

route(FakeRequest(POST, "/bob", FakeHeaders(Seq(CONTENT_TYPE->Seq("application/json"))), jsonStr))(Writeable(_.getBytes, None)).get
对于多个测试,可以在开始时为
可写的
创建隐式测试,并且不需要在每个测试中都通过:

implicit val wString: Writeable[String] = Writeable(_.getBytes, None)

谢谢,它起作用了。它可以缩短为
可写(u.getBytes,None)
因此:
路由(FakeRequest(POST,/bob”).withHeaders(“Content Type”->“application/json”).withBody(jsonStr))(Writeable(u.getBytes,None)).get
,或者如果我有很多测试,我可以为它创建一个隐式val:
隐式val wString:Writeable[String]=Writeable(uu.getBytes,None)
。你知道为什么它不会击中测试中的
/x-endpoint/y-endpoint
。-这是我的控制器和路由/