2013-05-30 104 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

相关问题