Funktion kutsuminen specs2:lla ei kutsu funktiota

Työskentelen saadakseni testitapauksen, joka toimii Play 2.1.1:n ja Specs2:n kanssa, ja olen törmännyt mielenkiintoiseen ongelmaan. Luon FakeRequestin lähetettäväksi ohjaimelle, mutta ohjaimen toimintoa ei koskaan kutsuta.

Tässä on testikoodi (hieman yksinkertaistettu, mutta kaikki liikkuvat osat):

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

Ja tässä on ohjaimen päätoiminto (no, ainakin sen alku):

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

Tämä koodi ei koskaan osu mainoksi. Kummallista kyllä, jos teen FakeHeaderin ilman parametreja ja poistan AnyContentAsXml:n lähettämällä vain Xml-elementin ohjaimeen, se toimii:

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

Onko kenelläkään aavistustakaan miksi näin kävisi?


person msiebert    schedule 06.08.2013    source lähde


Vastaukset (1)


Tässä on testisi vähän muokattuna, joka näyttää kaksi tapaa testata ohjainta. Syy, miksi AnyContentAsXml ei toimi sinulle, koska testauksessasi sekoitetaan kaksi lähestymistapaa.

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

}

Toisessa lähestymistavassa Play huolehtii xml-tiedoston purkamisesta BodyParserin käyttöä varten. Ja tässä ohjain:

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