如何为“a,b,c”编写Specs2匹配器.containsAllOf(“b”,“a”)?

时间:2013-05-30 17:55:31

标签: scala playframework-2.0 playframework-2.1 specs2

我是Scala / Play 2.1 / Specs2堆栈的新手,所以如果这个问题看起来很简单,请原谅我,但我在编写规范以测试“字符串包含单词'GET'”的情况时遇到了困难。我有一个Play 2.1 Action,它返回一个Access-Control-Allow-Methods标头值,如

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

My Spec对其他标头进行直接相等检查没有问题,但我一直无法弄清楚如何检查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中表达“这个字符串是否包含所有这些值”的用例?

1 个答案:

答案 0 :(得分:5)

这与你想要完成的事情类似:

"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匹配器中使用Seq。要使这种比较工作,两个项目都需要Traversable。为了达到这一点,我首先检查Option以确保它是Some。然后我得到它并将其拆分为逗号并将其转换为Seq。一旦两个部分都为Traversable,您就可以使用containAllOf匹配器。