2

エンティティトラフを作成する create メソッドがありますPOST:

  def create = Action(parse.json) { request =>
    val address = Json.fromJson[Address](request.body)
    Ok(address.toString())
  }

次のようにテストしたい:

 "A POST request on addresses create method" should "return OK " in {
    val node = Json.toJson(Address(None, "street 2", "33", "343333", "Arad", "Romania", None))(controllers.AddressBean.addressWrites);
    val result = AddressBean.create(FakeRequest().withJsonBody(node, Helpers.POST))

    status(result) should equal(OK)
    contentType(result) should be(Some("application/json"))
  }

しかし、私にはこの警告について奇妙に思えますstatus(result):

型の不一致; 見つかった: play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result] 必須: play.api.mvc.Result

このタイプの不一致が発生する理由を知っている人はいますか?

4

1 に答える 1

3

Jamesから受け取った解決策をGoogleグループに投稿しています。おそらく他の人にも役立つでしょう。

残念ながら、この混乱は Action に 2 つの適用メソッドが存在することに起因します。1 つは RequestHeader を受け入れるメソッドで、もう 1 つは Request[A] を受け入れるメソッドです。ここで、A はアクションが受け入れるボディのタイプでなければなりません。したがって、間違ったボディ タイプのリクエストを渡すと、requestHeader apply メソッドが使用されます。これが iteratee を返します。

したがって、あなたの問題は、間違った体型を渡すことです。withJsonBody は AnyContent のコンテンツ タイプを渡します。これは、アクションでパーサーを明示的に指定しない場合に使用されるものです。しかし、あなたは parse.json を使用しています。つまり、本体は JsonNode です。だから、次のようなことを試してください:

new FakeRequest(Helpers.POST, "/", FakeHeaders(), node)

したがって、最終的に私のPOSTテスト方法 (scalatest を使用) は次のようになります。

    "A POST request on addresses create method" should "return OK " in {
    val node = Json.toJson(Address(Some(12), "street 2", "33", "343333", "Arad", "Romania", None))(controllers.AddressBean.addressWrites);
    val result = AddressBean.create(new FakeRequest(Helpers.POST, "/", FakeHeaders(), node))

    status(result) should equal(OK)
    contentType(result) should be(Some("application/json"))
  }
于 2012-11-27T18:01:06.573 に答える