2

Scala /Play2.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

したがって、Im think status(result)matchはAnyに評価されているため、エラーになります。戻り値が偽のデフォルトのケースがある場合、その結果タイプがResultであることをどのように指定する必要がありますか?

4

2 に答える 2

6

アンドレアの答えに1つの精度を追加したいと思います。

実際、各ブランチは、に変換できる共通のタイプを生成する必要がありますResult。最初のブランチタイプはMatchResult[Option[String]]で、2番目と3番目のタイプはタイプResultです。

MatchResultの代わりにを使用して型注釈を回避する方法がありResultます。okおよびkoは2MatchResult秒で、およびと同等で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")
  }
}
于 2013-01-22T21:57:54.457 に答える
4

一致の各ブランチがspecs2に変換可能な結果になることを確認する必要がありますResult。したがって、の代わりに、を使用trueすることができます。successthrow 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
 }
于 2013-01-22T10:23:04.733 に答える