【问题标题】:Using pattern matching with Specs2 and Play in Scala在 Scala 中使用 Specs2 和 Play 的模式匹配
【发布时间】:2013-01-05 12:30:13
【问题描述】:

我对 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

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

【问题讨论】:

  • 您可以在末尾添加must not(throwA[MyException])。我会坚持一些自定义异常,而不是一般异常。
  • 我在最后添加时遇到问题,我尝试在匹配后添加它,即 -> status(result)match{...} 不能(throwA[Exception]),现在我得到:' ;'预期但找到标识符。 [错误] } 不能 (throwA[Exception])

标签: scala playframework-2.0 specs2


【解决方案1】:

我想为 Andrea 的回答增加一个精度。

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

有一种方法可以通过使用MatchResult 而不是Result 来避免类型注释。 okko是2个MatchResults,相当于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")
  }
}

【讨论】:

  • 我认为这解决了问题,改变了接受的答案!
【解决方案2】:

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

编辑: 看来您还必须帮助 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
 }

【讨论】:

  • 我是这样写的,现在我得到:ScalaObject => org.specs2.execute.Result 没有可用的隐式视图
  • 谢谢,效果很好。我认为 scalac 类型推断可以单独完成,但很遗憾,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-19
  • 2012-12-08
  • 2011-08-08
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2021-12-17
相关资源
最近更新 更多