播放2:如何使用非空请求体测试控制器

时间:2014-10-08 09:50:54

标签: scala testing playframework-2.0

我无法弄清楚如何在Play 2.3中测试控制器(功能测试)。

问题是我想测试的控制器没有看到我的请求体。 示例代码:

--- //contents of a specs2 example
"simple controller test" in new WithApplication {
  val requestBody = JacksMapper.writeValueAsString(Map("client_uuid" -> "uuid"))
  val request = new FakeRequest(
    POST, controllers.routes.EventsController.createEvent().url,
    FakeHeaders(Seq(CONTENT_TYPE -> Seq("application/json"))), requestBody)

  println(request.body) // => {"client_uuid":"client"}

  val result = route(request).get
  println(contentAsString(result)) // => {"client_uuid":["This field is required"]}
}

--- //Overall code was stripped down for greater clarity

当我提供" client_uuid"时,我不明白为什么我会收到验证错误。在请求中。 也许有人可以指出我正确的方向?是否有一种简单的方法来编写功能测试(例如在Rails中)?

修改:控制器源代码

object EventsController extends Controller {
  def createEvent = Action { implicit request =>
    val eventForm.bindFromRequest.fold(
      formWithError => BadRequest(formWithError.errorsAsJson),
      event => //persist event
    )

   val eventForm = Form(single("client_uuid" -> nonEmptyText))
  }

P.S。如果我直接调用控制器方法,我会得到相同的结果。 P.P.S. API方法在开发中工作正常。

1 个答案:

答案 0 :(得分:1)

我的猜测是JSON字符串未正确编码。我尝试直接使用Play的JSON API:

import play.api.lib.json._
val requestBody = Json.obj("client_uuid" -> JsString("uuid"))
val request = new FakeRequest(
  POST, controllers.routes.EventsController.createEvent().url,
  FakeHeaders(Seq(CONTENT_TYPE -> Seq("application/json"))), requestBody)