在ScalaTest中处理双打
我刚刚开始使用ScalaTest,我使用以下内容来比较我的规范中的两个double,如下所示:在ScalaTest中处理双打,scala,scalatest,Scala,Scalatest,我刚刚开始使用ScalaTest,我使用以下内容来比较我的规范中的两个double,如下所示: it should "calculate the price" in { val x = new X(10,10,12,1000) assert(x.price() === 185.92) } 尽管我输入了一个错误的值185.92来与price函数返回的值进行比较(对于上面的情况,它实际返回10.23),规范还是通过了。我还有其他的规范,我只是比较了int,它们按预期工作。但
it should "calculate the price" in {
val x = new X(10,10,12,1000)
assert(x.price() === 185.92)
}
尽管我输入了一个错误的值185.92来与price函数返回的值进行比较(对于上面的情况,它实际返回10.23),规范还是通过了。我还有其他的规范,我只是比较了int
,它们按预期工作。但是那些涉及双打的球员不管怎样都会通过。除了断言
之外,我还应该使用其他函数来比较双倍
编辑:
在我看来,您似乎在范围内有一个
相等[Double]
的隐式实例,其行为org.scalatic.TolerantNumerics
,文档对此进行了说明
文档中的示例为:
implicit val doubleEquality = TolerantNumerics.tolerantDoubleEquality(0.01)
但在您的案例中,似乎有人用一个非常大的容差值对其进行了实例化
您也可以考虑使用<代码> +-<代码>:
assert(x.price() === 185.92 +- 0.01)
如果使用
FlatSpec
,您只需执行actual shouldBe(预期+-公差)
;其他规范有类似的匹配器,而不是应该是。它在出现故障时比断言提供更好的消息,并且代码与其他测试一致。不是您的实际问题,但您不应该使用双精度(或任何浮点类型)来表示价格。使用BigDecimal
或Spire类型-一种无论如何都可以执行精确十进制运算的类型。是的,我将使用Spire,但目前我只是在尝试ScalaTest。我的第一个理论是x.price()返回的类型认为此实例等于双185.92。您能否显示x.price()返回的类型?此外,您还可以混合使用org.scalactic.TypeCheckedEquality,或导入org.scalactic.TypeCheckedEquality。\如果类型不匹配,则会出现类型错误。@Billveners,已添加了price
函数的定义。顺便说一句,我不能保证质量。它已经从scalatic中删除了吗?谢谢比尔。ScalaTest现在强调了主要问题。我混合了TypeCheckedTripleEquals,它在本文的测试之前(在同一规范中)显示了一个类型问题。该测试中函数的返回类型为Double
,但我将其与Int
文本值进行比较。因此,ScalaTest似乎忽略了类型不匹配的测试之后的测试。
assert(x.price() === 185.92 +- 0.01)