2012-10-29 15 views
6

मैं निम्नलिखित कार्रवाईखेलने ढांचा 2: शरीर के रूप में एक json तार के साथ एक अनुरोध का परीक्षण

def save() = Action(parse.json) { implicit request => 
    request.body.asOpt[IdeaType].map { ideatype => 
    ideatype.save.fold(
     errors => JsonBadRequest(errors), 
     ideatype => Ok(toJson(ideatype)) 
    ) 
    }.getOrElse  (JsonBadRequest("Invalid type of idea entity")) 
} 

है और मैं यह

परीक्षण करने के लिए वेब सेवा इस तरह कर्ल के साथ ठीक काम करता है चाहते हैं:

curl -X post "http://localhost:9000/api/types" 
--data "{\"name\": \"new name\", \"description\": \"new description\"}" 
--header "Content-type: application/json" 

जो सही ढंग से नए संसाधन रिटर्न

{"url":"/api/types/9","id":9,"name":"new name","description":"new description"} 

मैं

"add a new ideaType, using route POST /api/types" in { 
    running(FakeApplication(additionalConfiguration = inMemoryDatabase())) { 

    val json = """{"name": "new name", "description": "new description"}""" 

    val Some(result) = routeAndCall(
     FakeRequest(
     POST, 
     "/api/types", 
     FakeHeaders(Map("Content-Type" -> Seq("application/json"))), 
     json 
    ) 
    ) 

    status(result) must equalTo(OK) 
    contentType(result) must beSome("application/json") 
    val Some(ideaType) = parse(contentAsString(result)).asOpt[IdeaType] 

    ideaType.name mustEqual "new name" 

    } 
} 

साथ यह परीक्षण करने के लिए कोशिश कर रहा हूँ लेकिन मैं निम्नलिखित त्रुटि हो रही है: Play 2 - Scala FakeRequest withJsonBody

मैं कुछ याद आ रही है:

[error] ! add a new ideaType, using route POST /api/types 
[error]  ClassCastException: java.lang.String cannot be cast to play.api.libs.json.JsValue (IdeaTypes.bak.scala:35) 
[error] controllers.IdeaTypes$$anonfun$save$1.apply(IdeaTypes.bak.scala:36) 
[error] controllers.IdeaTypes$$anonfun$save$1.apply(IdeaTypes.bak.scala:35) 
[error] play.api.mvc.Action$$anon$1.apply(Action.scala:170) 

मैं इस सवाल पर सलाह का पालन किया ?

-

किम Stebel समाधान ठीक काम किया, लेकिन फिर मैं withJsonBody साथ करने की कोशिश की, इस तरह:

val jsonString = """{"name": "new name", "description": "new description"}""" 
    val json: JsValue = parse(jsonString) 

    val Some(result) = routeAndCall(
     FakeRequest(POST, "/api/types"). 
     withJsonBody(json) 
    ) 

और मैं निम्नलिखित त्रुटि मिलती है:

[error] ! add a new ideaType, using route POST /api/types 
[error]  ClassCastException: play.api.mvc.AnyContentAsJson cannot be cast to play.api.libs.json.JsValue (IdeaTypes.bak.scala:35) 
[error] controllers.IdeaTypes$$anonfun$save$1.apply(IdeaTypes.bak.scala:36) 
[error] controllers.IdeaTypes$$anonfun$save$1.apply(IdeaTypes.bak.scala:35) 

किसी भी विचार?

+0

करने के लिए लाइन

val json = """{"name": "new name", "description": "new description"}""" 

बदलें? –

+0

अपवाद "def save() = action ..." लाइन पर होता है ... – opensas

+0

अपना मार्ग पेस्ट करें और कॉल मदद कर सकता है। – wliao

उत्तर

9

आपको शायद अनुरोध के निकाय के रूप में JsValue में पास करने की आवश्यकता है। जो लाइन पर excepton होती है

val jsonString = """{"name": "new name", "description": "new description"}""" 
val json = Json.parse(jsonString) 
+0

आप सही हैं, किम। लेकिन मैंने सोचा कि FakeRequest इसे पार्स करना चाहिए। जब मैं इसे कर्ल से उपयोग करता हूं, तो मैं सिर्फ एक स्ट्रिंग भेज रहा हूं ... – opensas

+1

लेकिन उस स्थिति में अनुरोध ऑब्जेक्ट बनने से पहले फ्रेमवर्क द्वारा इसे पार्स किया जाता है। –

+0

बहुत तार्किक लगता है। अब मैं कम वर्बोज कोड रखने के लिए जेसन बॉडी के साथ कोशिश कर रहा हूं, लेकिन यह काम नहीं करता है ... (मैंने सवाल संपादित किया ...) – opensas

संबंधित मुद्दे