L'appel d'une fonction à l'aide de specs2 n'appelle pas la fonction

Je travaille sur un scénario de test fonctionnant avec Play 2.1.1 et Specs2 et je rencontre un problème intéressant. Je crée une FakeRequest à envoyer à un contrôleur, mais la fonction du contrôleur n'est jamais appelée.

Voici le code de test (légèrement simplifié, mais avec toutes les pièces mobiles) :

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

Et voici la fonction principale du contrôleur (enfin, du moins juste le début) :

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

Ce code n'atteint jamais main. Curieusement, cependant, si je crée le FakeHeader sans paramètres et que je supprime AnyContentAsXml, en envoyant simplement l'élément Xml au contrôleur, alors cela fonctionne :

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

Quelqu'un a-t-il une idée de pourquoi cela se produirait ?


person msiebert    schedule 06.08.2013    source source


Réponses (1)


Voici votre test légèrement modifié montrant deux manières de tester le contrôleur. La raison pour laquelle AnyContentAsXml ne fonctionne pas pour vous est que vos tests mélangent deux approches.

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

}

Dans la deuxième approche, Play consiste à décompresser le fichier XML pour que BodyParser puisse l'utiliser. Et voici le contrôleur :

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