使用与Specs2的模式匹配和Scala中的Play

时间:2013-01-22 09:59:00

标签: scala playframework-2.0 specs2

我对Scala / Play 2.0和Specs有一个简单的问题。

这是我的测试

"Server" should {
"return a valid item with appropriate content type or a 404" in {
        val Some(result) = routeAndCall(FakeRequest(GET, "/item/1"))
        status(result) match {
            case 200 => contentType(result) must beSome("application/json")
            case 404 => true
            case _ => throw new Exception("The Item server did not return either a 200 application/json or a 404")
        }
        //false   --> It only compiles if I add this line!
 }
}
}

由于以下因素而无法编译:

 No implicit view available from Any => org.specs2.execute.Result.
[error]     "return a valid item with appropriate content type or a 404" in {
[error]                                                                  ^
[error] one error found

所以我认为状态(结果)匹配正在评估任何因此错误。如果我有一个带有错误返回值的默认情况,我应该如何指定其结果类型为Result?

2 个答案:

答案 0 :(得分:6)

我想为Andrea的答案添加一个精度。

每个分支确实需要产生一个可以转换为Result的公共类型。第一个分支类型是MatchResult[Option[String]],第二个和第三个类型是Result类型。

有一种方法可以使用MatchResult而不是Result来避免类型注释。 okko为2 MatchResult,相当于successfailure,可在此处使用:

"return a valid item with appropriate content type or a 404" in {
  val Some(result) = routeAndCall(FakeRequest(GET, "/item/1"))
  status(result) match {
    case 200 => contentType(result) must beSome("application/json")
    case 404 => ok
    case _   => ko("The Item server did not return ... or a 404")
  }
}

答案 1 :(得分:4)

您应该确保匹配的每个分支都可以转换为specs2 Result。因此,您可以使用true代替success而不是throw new Exception("...")而不是failure("...")

修改 看来你还需要帮助Scalac了解一下。在匹配项周围添加括号,并将类型归类为:

import org.specs2.execute.Result

"return a valid item with appropriate content type or a 404" in {
    val Some(result) = routeAndCall(FakeRequest(GET, "/item/1"))
    (status(result) match {
      case 200 => contentType(result) must beSome("application/json")
      case 404 => success
      case _ => failure("The Item server did not return either a 200 application/json or a 404")
    }): Result
 }