Thirrja e një funksioni duke përdorur specs2 nuk e thërret funksionin

Unë jam duke punuar për të marrë një rast testimi që punon me Play 2.1.1 dhe Specs2 dhe po has një problem interesant. Unë krijoj një FakeRequest për ta dërguar te një kontrollues, por funksioni në kontrollues nuk thirret kurrë.

Këtu është kodi i provës (pak i thjeshtuar, por me të gjitha pjesët lëvizëse):

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

Dhe këtu është funksioni kryesor në kontrollues (mirë, të paktën vetëm fillimi i tij):

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

Ky kod kurrë nuk godet kryesore. Çuditërisht, megjithatë, nëse bëj FakeHeader pa parametra dhe heq AnyContentAsXml, thjesht duke dërguar Elementin Xml te kontrolluesi, atëherë funksionon:

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

A ka dikush ndonjë ide pse do të ndodhte kjo?


person msiebert    schedule 06.08.2013    source burimi


Përgjigjet (1)


Këtu është testi juaj pak i modifikuar që tregon dy mënyra për të testuar kontrolluesin. Arsyeja pse AnyContentAsXml nuk po funksionon për ju, sepse testimi juaj po përzien dy qasje së bashku.

"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ë qasjen e dytë, Play kujdeset për shpaketimin e xml për ta përdorur BodyParser. Dhe këtu është kontrolluesi:

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