6

私は次のアクションを持っています

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 で問題なく動作します。

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

何か不足していますか?

--

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

何か案が?

4

1 に答える 1

9

おそらくJsValue、リクエストの本文として a を渡す必要があります。行を変更する

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

val jsonString = """{"name": "new name", "description": "new description"}"""
val json = Json.parse(jsonString)
于 2012-10-29T06:13:51.453 に答える