0

我正在努力让一个测试用例与 Play 2.1.1 和 Specs2 一起使用,并且遇到了一个有趣的问题。我创建了一个 FakeRequest 发送到控制器,但控制器中的函数永远不会被调用。

这是测试代码(略微简化,但包含所有移动部件):

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

这段代码永远不会命中 main。但是,奇怪的是,如果我制作没有参数的 FakeHeader,并删除 AnyContentAsXml,只需将 Xml 元素发送到控制器,那么它就可以工作:

new FakeRequest(
    PUT,
    routes.MyController.main().toString,
    new FakeHeaders,
    <xml>xml</xml>
)

有谁知道为什么会发生这种情况?

4

1 回答 1

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("")
}
于 2013-08-06T16:56:20.920 回答