我无法弄清楚如何在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方法在开发中工作正常。
答案 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)