是否可以使用assertResult在ScalaTest中检查数组是否为equallity

Wil*_*ire 2 arrays scala scalatest scala-collections

验证scala集合的预期值时,assertResult方法很方便:

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

如果出现问题,会生成错误消息:

Expected List(10, 20), but got List(10, 30)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不适用于数组,因为==运算符检查标识,而不是相等(这种行为背后的原因已经讨论了很多,例如:为什么Array的= =函数不为数组返回true(1,2) ==数组(1,2)?).

因此,类似的数组检查会生成以下错误消息:

Expected Array(10, 20), but got Array(10, 20) 
Run Code Online (Sandbox Code Playgroud)

原因是,可以使用should equal匹配器:

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

但IMO不那么方便,因为它更像是一种期望验证的平等检查:

Array(10, 20) did not equal Array(10, 30)
Run Code Online (Sandbox Code Playgroud)

是否对ScalaTest中的数组进行了断言检查,清楚地将预期结果与实际结果分开?

sen*_*nia 5

你可以使用.seq方法Array来包装它WrappedArray像这样:

assertResult(Array(10, 20).seq){Array(10, 20).seq}
Run Code Online (Sandbox Code Playgroud)

Array#equals 实现为引用相等:

Array(10, 20) == Array(10, 20)
// Boolean = false
Run Code Online (Sandbox Code Playgroud)

WrappedArray#equals 实现为元素平等:

Array(10, 20).seq == Array(10, 20).seq
// Boolean = true
Run Code Online (Sandbox Code Playgroud)


Bil*_*ers 5

哇,我实际上认为这是一个错误,因为它与其他断言不一致.尽管如此,这个漏洞大约有六七年没有被发现.我会修复它,但在此期间你可以做的就是调用.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 }
Run Code Online (Sandbox Code Playgroud)