Funkcijas izsaukšana, izmantojot specs2, neizsauc funkciju

Es strādāju pie tā, lai iegūtu testa gadījumu darbam ar Play 2.1.1 un Specs2, un man rodas interesanta problēma. Es izveidoju FakeRequest, lai nosūtītu uz kontrolieri, taču kontrollera funkcija nekad netiek izsaukta.

Šeit ir testa kods (nedaudz vienkāršots, bet ar visām kustīgajām daļām):

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

Un šeit ir galvenā kontrollera funkcija (labi, vismaz tikai tās sākums):

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

Šis kods nekad nesasniedz galveno. Tomēr dīvainā kārtā, ja es izveidoju FakeHeader bez parametriem un noņemu AnyContentAsXml, vienkārši nosūtot Xml elementu uz kontrolieri, tas darbojas:

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

Vai kādam ir nojausma, kāpēc tas varētu notikt?


person msiebert    schedule 06.08.2013    source avots


Atbildes (1)


Šeit ir jūsu tests, kas ir nedaudz pārveidots, parādot divus kontroliera testēšanas veidus. Iemesls, kādēļ AnyContentAsXml jums nedarbojas, jo jūsu testēšanā tiek sajauktas divas pieejas.

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

}

Otrajā pieejā Play ir jārūpējas par xml izpakošanu BodyParser lietošanai. Un šeit ir kontrolieris:

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