Наиболее гибкий способ справиться с этим, вероятно, использует поддержку ScalaTest для символов для обработки логических совпадений свойств. Итак, все следующие тесты работают и выдают довольно полезное сообщение об ошибке при ошибке:
class DoubleSpec extends FreeSpec with Matchers {
"NaN should be NaN" in {
Double.box(Double.NaN) shouldBe 'NaN
}
"1 should not be NaN" in {
Double.box(1d) should not be 'NaN
}
"Infinity should be infinite" in {
Double.box(Double.PositiveInfinity) shouldBe 'Infinite
}
"1 should not be infinite" in {
Double.box(1d) should not be 'Infinite
}
}
К сожалению, поддержка символов существует только для ссылочных типов - требуется неявный параметр T <:< AnyRef
.Я приветствую предложения по обработке этого вопроса без необходимости звонить Double.box
каждый раз.
Вы также можете написать свои собственные соответствия для этого:
val NaN : BeMatcher[Double] = (left: Double) => MatchResult(
left.isNaN,
s"$left is not NaN",
s"$left is NaN"
)
"NaN should be NaN" in {
Double.NaN shouldBe NaN
}
"1 should not be NaN" in {
1d should not be NaN
}
Избегает проблемы с боксом и больше типа-безопасно, но требует нескольких дополнительных строк кода.