如何编写Scalatest测试以将列表中的值与范围进行匹配?

Gly*_*oko 5 scala scalatest

如何使用Scalatest编写测试以查看列表是否在给定范围内包含双精度?

例如,如何检查以下列表中的元素大约为10?

val myList = List(1.5, 2.25, 3.5, 9.9)
Run Code Online (Sandbox Code Playgroud)

对于列表之外的值,我可能会写一个测试

someVal should be (10.0 +- 1.0)
Run Code Online (Sandbox Code Playgroud)

对于可以精确知道其值的列表,我会写

someList should contain (3.5)
Run Code Online (Sandbox Code Playgroud)

但据我所知,没有一种好的方法可以使用范围来测试列表中的项目。就像是

someList should contain (10.0 +- 1.0)
Run Code Online (Sandbox Code Playgroud)

似乎不起作用。知道如何编写一个优雅的测试来实现这一目标吗?

Xav*_*hot 4

您可以使用 TolerantNumerics 指定双精度:

import org.scalatest.FlatSpec
import org.scalactic.TolerantNumerics
import org.scalatest.Matchers._

class MyTest extends FlatSpec {

  implicit val doubleEquality = TolerantNumerics.tolerantDoubleEquality(0.1)

    9.9d should be(10.0 +- 1.0)
    List[Double](1.5, 2.25, 3.5, 9.9) should contain(10.0)
}
Run Code Online (Sandbox Code Playgroud)

这会失败:

List[Double](1.5, 2.25, 3.5, 9.8) should contain(10.0)
Run Code Online (Sandbox Code Playgroud)

这应该会成功:

List[Double](1.5, 2.25, 3.5, 9.9) should contain(10.0)
Run Code Online (Sandbox Code Playgroud)