找到" play.api.libs.iteratee.Iteratee [Array [Byte],play.api.mvc.Result]"要求" play.api.mvc.Result"错误

时间:2012-12-10 18:22:14

标签: scala playframework playframework-2.0

使用Play 2.1-RC1我无法编写简单的测试。

这是行动代码:

def echoTestTagFromXml = Action(parse.xml) { request =>
    (request.body \ "test" headOption).map(_.text).map { test =>
        Ok(views.xml.testTag(test))
    }.getOrElse {
      BadRequest("Missing parameter [name]")
    }
}

这是测试代码:

"Test Tag Xml Echo" in {
    running(FakeApplication()) {
      val req = new FakeRequest(POST, controllers.routes.SimpleResultsController.echoTestTagFromXml().url, FakeHeaders(), Xml("<test>gg</test>"))        
      val result = controllers.SimpleResultsController.echoTestTagFromXml()(req)
      status(result) must equalTo(OK)
    }
}

测试给出错误:

[error]  found   : play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]
[error]  required: play.api.mvc.Result

来自Google我知道问题出现在BodyParser中。但我不知道(在API调查之后)如何使代码工作。

1 个答案:

答案 0 :(得分:7)

以下修改过的测试代码应该有效,但我认为当前尝试将一个正文传递给一个FakeRequest时出现了一个错误,现在已经弃用了功能测试的一个宿醉'routeAndCall'功能。身体总是空的。

"Test Tag Xml Echo" in {
  running(FakeApplication()) {
    val req = FakeRequest(POST, controllers.routes.SimpleResultsController.echoTestTagFromXml().url, FakeHeaders(), Xml("<test>gg</test>"))
      .withHeaders(CONTENT_TYPE -> "text/xml")
    val result = await(controllers.SimpleResultsController.echoTestTagFromXml()(req).run)
    contentAsString(result) must equalTo("gg")
    status(result) must equalTo(OK)
  }
}

我有一个类似的问题,将Json传递到身体,但试图让这适用于你的身体解析器(注意差异)。另外,请设置内容类型标题。

但您可以使用'route'功能:

"Test Tag Xml Echo Route" in {
  running(FakeApplication()) {
    val result = route(FakeRequest(POST, "/SimpleResultsController").withHeaders(CONTENT_TYPE -> "text/xml"), Xml("<test>gg</test>")).get
    contentAsString(result) must equalTo("gg")
    status(result) must equalTo(OK)
  }
}

这似乎对我有用,你应该能够复制/粘贴这个解决方案。

如果您不想将路线重复为字符串,则可以像以前一样使用反向路线:controllers.routes.SimpleResultsController.echoTestTagFromXml().url