我对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?
答案 0 :(得分:6)
我想为Andrea的答案添加一个精度。
每个分支确实需要产生一个可以转换为Result
的公共类型。第一个分支类型是MatchResult[Option[String]]
,第二个和第三个类型是Result
类型。
有一种方法可以使用MatchResult
而不是Result
来避免类型注释。 ok
和ko
为2 MatchResult
,相当于success
和failure
,可在此处使用:
"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
}