Apelarea unei funcții folosind specs2 nu apelează funcția

Lucrez la obținerea unui caz de testare care să funcționeze cu Play 2.1.1 și Specs2 și mă confrunt cu o problemă interesantă. Creez o cerere Fake pentru a o trimite unui controler, dar funcția din controler nu este apelată niciodată.

Iată codul de testare (puțin simplificat, dar cu toate părțile mobile):

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

Și iată funcția principală din controler (ei bine, cel puțin doar începutul acesteia):

def main() = Action(BodyParsers.parse.xml) { request =>
    println("main")
}

Acest cod nu ajunge niciodată la principal. În mod ciudat, totuși, dacă fac FakeHeader fără parametri și elimin AnyContentAsXml, trimițând doar elementul Xml la controler, atunci funcționează:

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

Are cineva idee de ce s-ar întâmpla asta?


person msiebert    schedule 06.08.2013    source sursă


Răspunsuri (1)


Iată testul dvs. puțin modificat, care arată două moduri de testare a controlerului. Motivul pentru care AnyContentAsXml nu funcționează pentru dvs., deoarece testarea dvs. combină două abordări.

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

}

În cea de-a doua abordare, Play este să aveți grijă să despachetați fișierul xml pentru ca BodyParser-ul să îl folosească. Și iată controlerul:

def main = Action(BodyParsers.parse.xml) { request =>
   println(">>>>>>>>>>>>>>>>>>> main")
  Ok("")
}
person Nilanjan    schedule 06.08.2013