Ale*_*noy 4 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]")
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试代码:
"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)
}
}
Run Code Online (Sandbox Code Playgroud)
测试给出错误:
[error] found : play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]
[error] required: play.api.mvc.Result
Run Code Online (Sandbox Code Playgroud)
来自谷歌,我知道问题出在BodyParser中.但我不知道(在API调查之后)如何使代码工作.
小智 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)
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题,将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)
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎对我有用,你应该能够复制/粘贴这个解决方案.
如果您不想将您的路线重复为字符串,那么您可以像以前一样使用反向路线: controllers.routes.SimpleResultsController.echoTestTagFromXml().url