2013-05-30 107 views
1

我是新來的Scala/Play 2.1/Specs2堆棧,所以請原諒,如果這個問題看起來很簡單,但我有困難寫一個規範來測試「字符串包含單詞'GET'」的情況。我有一個玩2.1的行動,返回Access-控制允許的方法像頭值如何爲「a,b,c」.containsAllOf(「b」,「a」)編寫Specs2匹配器?

Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS 

我的規格有沒有問題做其他頭直平等的檢查,但我一直無法弄清楚如何檢查每個GET,PUT,POST,DELETE和OPTIONS的Access-Control-Allow-Methods標頭。我期待像「必須包含(」 GET「)工作,但在IDE那張紅色這與一些:

type mismatch; found : org.specs2.matcher.ContainMatcher[String] required: org.specs2.matcher.Matcher[Option[String]] SessionsSpec.scala /dm2-server/test/admin line 53 Scala Problem 

我的規格看起來像......

"send 200 on OPTIONS request on valid route" in { 
    running(FakeApplication()) { 
    var fakeReq = FakeRequest("OPTIONS", "/admin/sessions") 
    val Some(result) = route(fakeReq) 
    status(result) must equalTo(OK) 
    header(ACCESS_CONTROL_ALLOW_ORIGIN, result) must equalTo(Some("*")) 
    header(ACCESS_CONTROL_ALLOW_HEADERS, result) must equalTo(Some(CONTENT_TYPE)) 
    val expectedMethods = Seq(GET, PUT, POST, DELETE, "OPTIONS") 
    header(ACCESS_CONTROL_ALLOW_METHODS, result) must containAllOf(expectedMethods) 
    } 
} 

我如何表達的使用情況下,「此字符串包含所有這些值」在Specs2

+0

您使用的是什麼版本的scala和specs2? – cmbaxter

+0

斯卡拉是2.10.1。如果可以相信Scala-IDE,Specs2版本是specs2_21.10.jar。 –

+0

一個提示:不要寫'equalTo(Some(「*」))''你可以寫'beSome(「*」)' – Eric

回答

4

下面是類似的東西給你試圖完成什麼?

"A split option string " should{ 
    "be able to be verified with a containsAllOf matcher" in { 
    val headerVal = Some("a, b, c, d, e") 
    val expected = Seq("a", "e") 

    headerVal must beSome 
    headerVal.get.split(", ").toSeq must containAllOf(expected) 
    } 
} 

問題在於你試圖採取Option[String]並在Traversable匹配器中使用。爲了進行這種比較,兩項都需要爲Traversable。爲了達到這一點,我首先檢查Option以確保它是Some。然後我得到它並將其分割成逗號,並將其變成Seq。一旦兩件都是Traversable,就可以使用那個containAllOf匹配器。

+1

你也可以在同一個表達式中做:'headerVal must beSome.like {case value => value.split(「,」)。toSeq必須包含AllOf(expected)}' – Eric

相關問題