2012-10-29 17 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")) 
} 

而且我想測試一下

web服務工作正常,像這樣捲曲:

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" 

    } 
} 

來測試它,但我發現了以下錯誤:

[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) 

我跟着這個問題的建議:Play 2 - Scala FakeRequest withJsonBody

我失去的東西?

-

金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

上線並在excepton發生? –

+0

「def save()= Action ...」行發生異常... – opensas

+0

粘貼您的routeAndCall可能會有所幫助。 – wliao

回答

9

您可能需要傳入JsValue作爲請求的主體。行

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

更改爲

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

你是對的,kim。但我認爲FakeRequest應該解析它。當我從curl使用它時,我只是發送一個字符串... – opensas

+1

但是在這種情況下,在創建請求對象之前它會被框架解析。 –

+0

聽起來很合邏輯。現在我正在和JsonBody一起嘗試,以減少冗長的代碼,但它不起作用......(我編輯了這個問題......) – opensas

相關問題