2012-08-10 11 views
19

मैं नियंत्रक पर एक क्रिया का परीक्षण करने की कोशिश कर रहा हूं।प्ले 2 - स्केल FakeRequest withJsonBody

यह एक नहीं बल्कि सरल कार्रवाई है, यह JSON लेता है और 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)) 
    )) 
    } 

पुष्टि के लिए मैं JSON लौटे चाहते वास्तव में सही है।

मैं ऐसा करने के लिए FakeRequest का उपयोग कैसे करूं?

+0

समान: http://stackoverflow.com/questions/28247112/playframework-fakerequest-reuturns-400-error – ses

उत्तर

19

हो सकता है कि कुछ इस तरह:

"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 
    } 
    } 
} 

नोट: val result लाइन अब के बाद से मैं एक परीक्षण एक Async नियंत्रक का उपयोग करता है से ले लिया सही हो सकता है।

+1

मेरे लिए काम किया जब अंदर '' FakeRequest' body' स्थापित किया गया था एक साधारण स्ट्रिंग –

+1

के बजाय जेएसवैल्यू (इसे पार्स किया गया था) होने के लिए मेरे लिए ".result.value" पर विफल रहता है। "परिणाम" – ses

+0

'FakeHeaders() '2.6 में काम नहीं करता है क्योंकि' होस्ट 'हेडर नहीं है वर्तमान में यह सुरक्षा चेतावनी देने और अनुरोध को अस्वीकार करने का कारण बनता है। साथ ही, सामग्री-प्रकार शीर्षलेख को टेक्स्ट/जेसन पर सेट करने की आवश्यकता होती है। इसलिए मुझे क्या करना है: 'val postHeaders = FakeHeaders (सूची (" HOST " -> "लोकलहोस्ट", "कंटेंट-टाइप" -> "टेक्स्ट/जेसन")) ', फिर:' FakeRequest (POST, path, postHeaders, body) ' –

4

मुझे एक ही समस्या थी। इसे इस तरह फिक्स्ड:

"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

' Si के बजाय iteratee लौटा mpleResult' – zinking

8

मैं Play 2.1 का उपयोग कर रहा हूं। @EtienneK विधि मेरे लिए काम नहीं कर रही है। यह मैं कैसे उपयोग करते हैं:

"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() 
     } 
    }