Scala “发现”;play.api.libs.iteratee.iteratee[Array[Byte],play.api.mvc.Result]";“必需”;play.api.mvc.Result“;错误

Scala “发现”;play.api.libs.iteratee.iteratee[Array[Byte],play.api.mvc.Result]";“必需”;play.api.mvc.Result“;错误,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,使用Play2.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

使用Play2.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)
    }
}

从谷歌我知道问题出在BodyParser。但是我不知道(在API调查之后)如何使代码工作

以下修改后的测试代码应该可以工作,但我认为在尝试将主体传递到伪造请求时存在一个bug,这在某种程度上是功能测试的遗留问题,现在不推荐使用“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)
  }
}
中的“测试标记Xml回显”{ 正在运行(FakeApplication()){ val req=FakeRequest(POST,controllers.routes.SimpleResultsController.echoTestTagFromXml().url,FakeHeaders(),Xml(“gg”)) .WithHeader(内容类型->“文本/xml”) val result=await(controllers.SimpleResultsController.echoTestTagFromXml()(req.run) contentAsString(结果)必须等于(“gg”) 状态(结果)必须等于(正常) } } 在将Json传递到主体中时,我也遇到了类似的问题,但我尝试在主体解析器中使用Json(注意区别)。另外,请设置内容类型标题

但是,您可以使用“路由”功能:

"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)
  }
}
中的“测试标记Xml回显路由”{ 正在运行(FakeApplication()){ val result=route(FakeRequest(POST,“/SimpleResultsController”)。带有标题(CONTENT_TYPE->“text/xml”)、xml(“gg”)。获取 contentAsString(结果)必须等于(“gg”) 状态(结果)必须等于(正常) } } 这似乎对我有效,您应该能够复制/粘贴此解决方案


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

第一个代码段为请求“POST/testechotag.example”[无效XML]

提供了带有
错误请求

的html。第二个代码段之前不提供任何内容。获取。看起来请求的形成是错误的,但我不知道为什么。是的,第一个代码片段会说无效的xml,因为正文没有传递给正文解析器,它是空的。检查第二个代码段的URL,并将其与routes文件进行比较。

"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)
  }
}