2013-03-05 13 views
13

にループ私はその後句でループを使用してテストを持っている:スポックユニットテストは、その後句

result.each { 
    it.name.contains("foo") 
    it.entity.subEntity == "bar" 
} 

for (String obj : result2) { 
    obj.name.contains("foo") 
    obj.entity.subEntity == "bar" 
} 

は、新たに私はループが実際にテストされていないことを認識しました。私がfooかbarか何かを持っているかどうかにかかわらず、テストは常に緑色です: 私は、ループが異なってテストされなければならないことがわかりました。 「every」は?しかし、「every」を「every」に変更するだけで例外がスローされます。

result.every { 
    it.name.contains("foo") 
    it.entity.subEntity == "bar" 
} 

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
Spec expression: 1: expecting '}', found '==' @ line 1, column 61. 
    s("foo") it.entity.rootEntity == "bar" } 

テストでループを正しく使用するにはどうすればよいですか?私はスポック0.7-グルーヴィー-2.0

答えて

22

を使用して明示的なアサートステートメントを使用しています:

result.each { 
    assert it.name.contains("foo") 
    assert it.entity.subEntity == "bar" 
} 

それともevery内の単一の論理式:

result.every { 
    it.name.contains("foo") && it.entity.subEntity == "bar" 
} 
+3

警告!最初のアプローチはより読みやすいエラーメッセージを生成しますが、 'result'が空のコレクションの場合は' false'(そして操作失敗)と評価されます! – Hubbitus

+0

追加警告: 'every'に渡すクロージャが複数の行である場合、2番目のメソッドが[現在解決されていないバグ](https://github.com/spockframework/spock/issues/253)に実行される可能性があります。 – jonnybot