2014-02-19 27 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

相关问题