2012-08-10 29 views
19

Estoy tratando de probar una acción en un controlador.Play 2 - Scala FakeRequest withJsonBody

Es una acción más sencilla, se necesita JSON y devuelve JSON:

def createGroup = Action(parse.json) { request => 
    val name = (request.body \ "name").as[String] 
    val collabs = (request.body \ "collabs").as[List[String]] 


    Ok(Json.toJson(
     Map("status" -> "OK", 
     "message" -> "%s created".format(name)) 
    )) 
    } 

Quiero verificar que el JSON devuelto es de hecho correcta.

¿Cómo usaría FakeRequest para hacer esto?

+0

similar: http://stackoverflow.com/questions/28247112/playframework-fakerequest-reuturns-400-error – ses

Respuesta

19

Tal vez algo como:

"POST createGroup with JSON" should { 
    "create a group and return a message" in { 
    implicit val app = FakeApplication() 
    running(app) { 
     val fakeRequest = FakeRequest(Helpers.POST, controllers.routes.ApplicationController.createGroup().url, FakeHeaders(), """ {"name": "New Group", "collabs": ["foo", "asdf"]} """) 

     val result = controllers.ApplicationController.createGroup()(fakeRequest).result.value.get 

     status(result) must equalTo(OK) 
     contentType(result) must beSome(AcceptExtractors.Accepts.Json.mimeType) 

     val message = Region.parseJson(contentAsString(result)) 

     // test the message response 
    } 
    } 
} 

Nota: La línea val result ahora podría ser correcta, ya que la aparté de un estudio que utiliza un controlador asíncrono.

+1

trabajado para mí cuando en el interior 'FakeRequest' se estableció el' body' para ser un JsValue (se analizó) en lugar de una cadena simple –

+1

falla en ".result.value" para mí. "resultado" – ses

+0

resalta "FakeHeaders()' no funciona en 2.6 porque el encabezado 'host' no se está ejecutando presente causa una advertencia de seguridad y rechaza la solicitud. Además, el encabezado del tipo de contenido debe establecerse en text/json. Entonces, lo que he tenido que hacer es: 'val postHeaders = FakeHeaders (List (" HOST ") -> "localhost", "content-type" -> "text/json")) ', luego:' FakeRequest (POST, path, postHeaders, body) ' –

4

Tuve el mismo problema. Se corrigió así:

"respond to the register Action" in { 
    val requestNode = Json.toJson(Map("name" -> "Testname")) 
    val request = FakeRequest().copy(body = requestNode) 
     .withHeaders(HeaderNames.CONTENT_TYPE -> "application/json"); 
    val result = controllers.Users.register()(request) 

    status(result) must equalTo(OK) 
    contentType(result) must beSome("application/json") 
    charset(result) must beSome("utf-8") 

    val responseNode = Json.parse(contentAsString(result)) 
    (responseNode \ "success").as[Boolean] must equalTo(true) 
    } 
+0

devuelto iteratee en lugar de' Si mpleResult' – zinking

8

Estoy usando Play 2.1. El método @EtienneK no funciona para mí. Esta es la forma en que utilizo:

"update profile with new desc" in { 
      running(FakeApplication()) { 
     var member1 = new MemberInfo("[email protected]") 
     member1.save() 
     var mId = member1.getMemberIdString() 

     val json = Json.obj(
      "description" -> JsString("this is test desc") 
       ) 
     val req = FakeRequest(
        method = "POST", 
        uri = routes.ProfileApiV1.update(mId).url, 
        headers = FakeHeaders(
        Seq("Content-type"->Seq("application/json")) 
       ), 
        body = json 
       ) 
       val Some(result) = route(req.withCookies(Cookie("myMemberId", mId))) 
     status(result) must equalTo(OK) 
     contentType(result) must beSome("application/json") 
     charset(result) must beSome("utf-8") 
     contentAsString(result) must contain("ok") 

     member1 = MemberInfo.getMemberInfoByMemberId(mId) 
     member1.delete() 
     } 
    } 
Cuestiones relacionadas