【问题标题】:Does Scalatest provider a matcher for NaN?Scalatest 提供 NaN 的匹配器吗?
【发布时间】:2019-10-27 19:44:51
【问题描述】:

Scalatest 是否为NaN 和无穷大提供匹配器?

如果有办法,我想让这些断言更具描述性:

Double.NaN.isNaN shouldBe true
Double.NegativeInfinity.isInfinite shouldBe true

【问题讨论】:

    标签: scala scalatest matcher


    【解决方案1】:

    处理这个问题的最灵活的方法可能是使用 ScalaTest 的support for symbols to handle boolean matches on properties. 所以,以下测试都可以正常工作,并在失败时给出非常有用的错误消息:

    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
      }
    

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

    【讨论】:

      【解决方案2】:

      根据定义,NaN 不等于任何东西 (https://en.wikipedia.org/w/index.php?title=NaN#Comparison_with_NaN)。

      出于这个原因,我认为 NaN 不会也应该存在任何 scalatest 匹配器,您最好像已经完成的那样使用 .isNaN。

      至于无限值,你同样可以使用:

      val value = -1.0/0.0
      value.isNegInfinity shouldBe true
      value.isInfinite shouldBe true
      value should equal (Double.NegativeInfinity)
      

      【讨论】:

        猜你喜欢
        • 2016-05-14
        • 2018-05-25
        • 1970-01-01
        • 2021-12-16
        • 2013-04-26
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        相关资源
        最近更新 更多