为什么测试方法失败?

时间:2012-11-26 17:35:22

标签: scala playframework-2.0

我有一个通过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 [数组[字节],play.api.mvc.Result]   必需:play.api.mvc.Result

有谁知道为什么会发生这种类型的不匹配?

1 个答案:

答案 0 :(得分:3)

我在这里发布了我从James收到的解决方案,谷歌群组,可能对其他人有用:

  

不幸的是,这种混淆来自Action上有两个apply方法,一个接受RequestHeader,另一个接受RequestHeader   接受请求[A],其中A必须是该主体的类型   行动接受。因此,如果您使用错误的正文传递请求   类型,它将使用RequestHeader应用方法,这是什么   返回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"))
  }