2014-02-19 33 views
2

當驗證階收集的預期值,assertResult方法簡便:是否有可能使用assertResult檢查equallity陣列中ScalaTest

"The list" should "be generated correctly" in { 
    assertResult(List(10, 20)) { 
    //Some code that should output 
    List(10, 20) 
    } 
} 

如果出現問題,會產生不錯的錯誤信息:

Expected List(10, 20), but got List(10, 30) 

不幸的是,它並不適用於陣列工作,因爲==運營商檢查的身份,而不是平等的(這種行爲背後的原因已經討論了很多,比如這裏:Why doesn't Array's == function return true for Array(1,2) == Array(1,2)?)。

所以,類似的檢查數組生成以下錯誤消息:

Expected Array(10, 20), but got Array(10, 20) 

原因,有可能使用should equal匹配:

"The array" should "be generated correctly" in { 
    Array(10, 20) should equal { 
    //Some code that should output 
    Array(10, 20) 
    } 
} 

但IMO它不太方便,因爲它更均等檢查期望驗證:

Array(10, 20) did not equal Array(10, 30) 

是重新對ScalaTest中的數組進行斷言檢查,從而將預期結果與實際結果明確區分開來?

回答

4

哇,其實我認爲這是一個bug,因爲它與其餘的斷言不一致。不過,這個bug在大約六七年後仍未被發現。我會解決它,但同時你可以做的是調用.deep。這就是你需要做的==與陣列,例如:

scala> Array(1, 2) == Array(1, 2) 
res12: Boolean = false 

scala> Array(1, 2).deep == Array(1, 2).deep 
res13: Boolean = true 

scala> assertResult(Array(1, 2)) { Array(1, 2) } 
org.scalatest.exceptions.TestFailedException: Expected Array(1, 2), but got Array(1, 2) 
... 

scala> assertResult(Array(1, 2).deep) { Array(1, 2).deep } 
+0

謝謝你的幫助! – Wildfire

4

你可以在Array使用.seq方法與WrappedArray包裹這樣的:

assertResult(Array(10, 20).seq){Array(10, 20).seq} 

Array#equals實現爲引用相等:

Array(10, 20) == Array(10, 20) 
// Boolean = false 

WrappedArray#equals爲元素的平等實現的:

Array(10, 20).seq == Array(10, 20).seq 
// Boolean = true 
+0

這是一個可行的解決方案,謝謝! – Wildfire

相關問題