2

我有一个创建方法来创建实体槽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

我在这里发布我从詹姆斯那里收到的解决方案,在谷歌群组上,也许对其他人有用:

不幸的是,这种混淆来自于 Action 上有两种 apply 方法,一种接受 RequestHeader,另一种接受 Request[A],其中 A 必须是 action 接受的主体类型。因此,如果您传递的请求正文类型错误,它将使用 RequestHeader 应用方法,该方法返回迭代对象。

所以,你的问题是你传递了错误的体型。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 回答