5

ここ数日、ScalaTest の FeatureSpec を使用しており、組み込みマッチャーを使用して次の仕様を定義できるかどうかを理解しようとしています (そうでない場合は、適切なカスタム マッチャーを作成する方法)。

クラスBookがあるとします:

case class Book(val title: String, val author: String)

私のテストでは、本のリストがあります:

val books = List(Book("Moby Dick", "Melville"))

ここで、本のリストに「Moby Dick」というタイトルの本が含まれるように指定したいと思います。次のようなものを書きたいと思います:

books should contain (value with title "Moby Dick")  

ScalaTest でこの要件を表現できるかどうか、ドキュメントとコードから判断できないようです。誰かが同様の状況に遭遇しましたか?

4

2 に答える 2

3

それまでの間、使用できるカスタムマッチャーを次に示します。

def containElement[T](right: Matcher[T]) = new Matcher[Seq[T]] {
  def apply(left: Seq[T]) = {
    val matchResults = left map right
    MatchResult(
      matchResults.find(_.matches) != None,
      matchResults.map(_.failureMessage).mkString(" and "),
      matchResults.map(_.negatedFailureMessage).mkString(" and ")
    )
  }
}

次に、ScalaTestHaveマッチャーの全機能を使用して、オブジェクトのフィールドを検査できます。

val books = List(Book("Moby Dick", "Melville"),
                 Book("Billy Budd", "Melville"), 
                 Book("War and Peace", "Tolstoy"))

books should containElement(have('title("Moby Dick")))
books should containElement(have('title("Billy Budd"), 'author("Melville")))
books should containElement(have('title("War and Peace"), 'author("Melville")))

最後の 1 つは、この出力を生成する失敗です。

オブジェクト Book(Moby Dick,Melville) の title プロパティの値は、その期待値「War and Peace」ではなく「Moby Dick」であり、 title プロパティの値は、その期待値「War and Peace」ではなく、値「Billy Budd」でした。 "、オブジェクト Book(Billy Budd,Melville) およびオブジェクト Book(War and Peace,Tolstoy) の author プロパティの値は、期待値 "Melville" ではなく "Tolstoy" でした

andマッチャーをor or、 usenotなどと組み合わせることもできます。

于 2013-03-19T15:53:04.443 に答える
2

現在はありませんが、近いうちにこのようなことができるようになります。今できることは次のようなものです。

books.exists(_.title == "Moby Dick") should be (true)
于 2011-08-09T19:03:58.443 に答える