我正在努力让一个测试用例使用Play 2.1.1和Specs2,并且遇到了一个有趣的问题。我创建一个FakeRequest发送到Controller,但控制器中的函数永远不会被调用。
这是测试代码(稍微简化,但包含所有可移动部件):
"controller" should {
"do something" in new WithApplication {
val controller = new MyController()
controller.main() {
new FakeRequest(
PUT,
routes.MyController.main().toString,
new FakeHeaders(Seq("Content-Type" -> Seq("text/xml"))),
AnyContentAsXml(<xml>xml</xml>)
)
}
}
这是控制器中的主要功能(好吧,至少只是它的开头):
def main() = Action(BodyParsers.parse.xml) { request =>
println("main")
}
此代码永远不会出现主要问题。但奇怪的是,如果我使FakeHeader没有参数,并删除AnyContentAsXml,只需将Xml元素发送到控制器,它就可以工作:
new FakeRequest(
PUT,
routes.MyController.main().toString,
new FakeHeaders,
<xml>xml</xml>
)
有谁知道为什么会这样?
答案 0 :(得分:0)
这是你的测试很少修改,显示了测试控制器的两种方法。 AnyContentAsXml之所以不适合您,是因为您的测试将两种方法混合在一起。
"one way" in new WithApplication {
val action = controllers.Application.main
val req: FakeRequest[scala.xml.NodeSeq] = new FakeRequest(
PUT,
"some url",
new FakeHeaders(Seq("Content-Type" -> Seq("text/xml"))),
<xml>xml</xml>
)
val x = action(req)
status(x) should beEqualTo(200)
}
"2nd way" in new WithApplication {
val Some(result) = route(new FakeRequest("PUT",
"/",
new FakeHeaders(Seq("Content-Type" -> Seq("text/xml"))),
AnyContentAsXml(<xml>xml</xml>)))
status(result) should beEqualTo(200)
}
}
在第二种方法中,Play负责解析xml以供BodyParser使用。这是控制器:
def main = Action(BodyParsers.parse.xml) { request =>
println(">>>>>>>>>>>>>>>>>>> main")
Ok("")
}