2013-08-06 41 views
0

我的工作得到一個測試用例播放2.1.1和Specs2工作,正在到一個有趣的問題調用函數。我創建了一個FakeRequest發送到控制器,但在控制器內的功能不會被調用。使用specs2不會調用函數

這裏的測試代碼(略有簡化,但所有的運動部件):

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

而這裏的控制器的主要功能(好吧,至少只是它的開始):

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

此代碼永遠不會打主力。奇怪的是,雖然,如果我做了FakeHeader不帶任何參數,並刪除AnyContentAsXml,只是發送XML元素到控制器,那麼它的工作原理:

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

沒有人有任何想法,爲什麼會發生這種情況?

回答

0

下面是測試的小修改顯示兩種方式測試控制器。 AnyContentAsXml不適合你的原因是因爲你的測試將兩種方法混合在一起。

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

}

在第二種方法玩的就是採取開箱XML爲BodyParser使用的護理。這裏是控制器:

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