Bob*_*har 2 scala specs2 playframework-2.0 playframework-2.1
我是Scala/Play 2.1/Specs2堆栈的新手,所以如果这个问题看起来很简单,请原谅我,但我在编写规范以测试"字符串包含单词'GET'"时遇到了困难.我有一个Play 2.1 Action,它返回一个Access-Control-Allow-Methods标头值
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS
Run Code Online (Sandbox Code Playgroud)
我的规范对其他标头进行直接相等检查没有问题,但是我一直无法弄清楚如何检查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
Run Code Online (Sandbox Code Playgroud)
我的规格看起来像......
"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)
}
}
Run Code Online (Sandbox Code Playgroud)
如何在Specs2中表达"这个字符串是否包含所有这些值"的用例?
这与你想要完成的事情类似:
"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)
}
}
Run Code Online (Sandbox Code Playgroud)
问题是你试图Option[String]在一个Traversable匹配器中使用它并使用它Seq.为了进行这种比较,两个项目都需要Traversable.为了达到这一点,我首先检查一下Option以确保它是一个Some.然后我得到它并将其拆分为逗号并将其转换为Seq.两件都是Traversable,你可以使用那个containAllOf匹配器.