2011-08-09 8 views
5

私はScalaTestのFeatureSpecを数日間使っていますが、ビルトインマッチャーを使って以下の仕様を定義できるかどうかを理解しようとしています(もしそうでなければ、適切なカスタムマッチャーを書く方法) 。ScalaTestのコレクション要素にHavePropertyMatcherを使用しますか?

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

と私のテストでは、私は本のリストを持っている:

は、私はクラスBookがあると

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

を、私は本のリストが含まれている必要があることを指定したいです"Moby Dick"というタイトルの本。それはScalaTestでこの要件を表現することが可能だ場合、私はドキュメントやコードから把握することができないよう

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

:私のような何かを書きたいです。誰も似たような状況に遭遇しましたか?

答えて

2

現在のところ、今後このようなことをすぐに行うことはできますが、一方

books.exists(_.title == "Moby Dick") should be (true) 
+0

私はこの機能を待つことができません。 '書籍には、{_titleはstartWith(" Moby ")でなければならず、_.authorは(" Melville ")でなくてはならない) – Steiny

2

ここにあなたが使用できるカスタムマッチャです:あなたが今できることは何かがある

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 ") 
    ) 
    } 
} 

次にあなたがフィールドを検査するScalaTest Haveマッチャーのフルパワーを使用することができますあなたのオブジェクトの:

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"))) 

最後のものは、この出力を生成する障害です:

タイトルプロパティは、オブジェクトブック(Moby Dick、Melville)の期待値 "War and Peace"の代わりに "Moby Dick"という値を持ち、titleプロパティは期待値ではなく値 "Billy Budd" 「戦争と平和」、オブジェクトの予約に(ビリー・バッド、メルヴィル)と著者特性が

オブジェクト帳(戦争と平和、トルストイ)に、代わりにその期待値「メルヴィル」の、値「トルストイ」を持っていましたandまたはorのマッチャーを組み合わせて、notなどを使用することもできます。

関連する問題