Google Groups

Re: [play-2.1-scala] problem with tests - FakeRequest and json


James Roper Nov 19, 2012 4:32 PM
Posted in group: play-framework
I've got a better solution for you.

Assuming this is your controller:

package controllers
object User {
 
def create(username: String) = Action(parse.json) { req =>
   
// Do something
   
Ok(req.body)
 
}
}

And here is your route

POST   /user/:username    controllers.User.create(username)

Then you can:

val json = Json.obj(
         
"email" -> JsString("test@example.com"),
         
"password" -> JsString("fakepassword")
       
)

val req
= FakeRequest().copy(body = json)

val result
= controllers.User.create("test")(req)
println
(contentAsString(result))
status
(result) must equalTo(OK)

That way you don't need to worry about the method or URI.

On Tuesday, 20 November 2012 10:15:14 UTC+11, meloniasty wrote:
Hi,

I'm getting problems with testing controller's method where input parameters are in json, for example:

val json = Json.obj(
          "email" -> JsString("fa...@email.pl"),
          "password" -> JsString("fakepassword")
        )

val req = FakeRequest(
          method = "POST",
          uri = "/user/test",
          headers = FakeHeaders(
            Seq("Content-type"->Seq("application/json"))
          ),
          body =  json
        )

val result = route(req).get
println(contentAsString(result))
status(result) must equalTo(OK)

and response content is always Bad Request - Invalid JSON

my routing is
POST /user/test controllers.user.test

if i run play in server mode and test via any rest browser client it's work perfectly

maybe its bug in 2.1 or i'm doing sth wrong ?

best regards
dawid