2015-04-01 18 views
1

我想在包含數組的case類的ScalaTest中聲明相等。 (所以內置的平等匹配器的情況下,類是不適用的。) 例子:如何爲嵌套的scala單元相等匹配器獲取有意義的錯誤消息?

case class Example(array: Array[Double], variable: Integer) 

測試存根:

val a = Example(Array(0.1, 0.2), 1) 
val b = Example(Array(0.1, 0.2), 1) 
a should equal (b) 

未能如預期。所以我實現了一個平等的特質:

implicit val exampleEq = 
new Equality[Example] { 
    def areEqual(left: Example, right: Any): Boolean = 
    right match { 
     case other: Example => { 
     left.array should contain theSameElementsInOrderAs other.array 
     left.variable should be other.variable 
     true 
     } 
     case _ => false 
    } 
} 

哪個有效。另一種選擇是在「應該是」的所有地方用==來實現等式特徵,並且假如它在一個地方是假的,則返回false,否則返回true。兩者都存在的問題是,在運行測試時,我得到錯誤消息,即「示例」對象不相同(如果它們不是),但我希望看到它們在哪個元素中有所不同。

我該如何做到這一點?

謝謝你的幫助!

[更新]在實踐中,示例包含多個數組和其他字段,我相應地更改了代碼。

回答

0

使用考慮:

left.array should contain theSameElementsInOrderAs other.array 

參考:Working with "sequences"

+0

謝謝您的回覆,我考慮過這個問題,但因爲我在課堂中有多個字段(例如10),我不想爲每個支票編寫10個應收帳單。 – DreamFlasher 2015-04-01 14:36:38

+0

@DreamFlasher也許我不清楚 - 不確定。我的意思是建議替換left.array.length應該是(other.array.length) (i < - 0直到left.array.length)left.array(i)應該是(other.array(i )) }''用'left.array應該包含theSameElementsInOrderAs other.array' – 2015-04-01 14:52:34

+0

啊謝謝,現在有道理,是的,你是對的,我不應該比較自己的元素,而是使用數組比較。但我仍然沒有出現錯誤? – DreamFlasher 2015-04-01 14:54:47

相關問題