Scalatest是否提供NaN的匹配器?

Mid*_*rse 5 scala matcher scalatest

Scalatest是否提供和的匹配器NaN

如果可以的话,我想使这些断言更具描述性:

Double.NaN.isNaN shouldBe true
Double.NegativeInfinity.isInfinite shouldBe true
Run Code Online (Sandbox Code Playgroud)

Ast*_*rid 6

解决此问题的最灵活方法可能是使用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
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,符号支持仅适用于引用类型- 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
  }
Run Code Online (Sandbox Code Playgroud)

避免了装箱问题,并且类型安全性更高,但确实需要一些额外的代码行。