Scala “发现”;play.api.libs.iteratee.iteratee[Array[Byte],play.api.mvc.Result]";“必需”;play.api.mvc.Result“;错误
使用Play2.1-RC1,我无法编写简单的测试 以下是行动代码: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
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)
}
}