Вызов функции с использованием спецификаций2 не вызывает функцию

Я работаю над созданием тестового примера, работающего с 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>
)

Кто-нибудь знает, почему это произойдет?


person msiebert    schedule 06.08.2013    source источник


Ответы (1)


Вот ваш немного измененный тест, показывающий два способа тестирования контроллера. Причина, по которой 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("")
}
person Nilanjan    schedule 06.08.2013