Извикването на функция чрез specs2 не извиква функцията

Работя върху получаване на тестов случай, работещ с 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