【问题标题】:ScalaTest - how to check that all items of sequence match the predicate?ScalaTest - 如何检查所有序列项是否与谓词匹配?
【发布时间】:2021-06-24 16:54:31
【问题描述】:

有没有办法显示更好的错误信息?比如下面的代码

it should "check that items satisfy predicate" in {
  List(1,2,3,4,5,6).forall(x => x < 5) should equal (true)
}

只给我以下错误,没有任何描述:

“假不等于真”

谓词不仅可以是least 表达式,还可以是任何其他函数。对于least,我找到了https://www.scalatest.org/user_guide/using_matchers#inspectorShorthands

【问题讨论】:

    标签: scala scalatest


    【解决方案1】:

    不仅可以是最少的表达,还可以是其他任何功能

    使用inspector试试

    forAll (xs) { x => assert(pred(x)) }
    

    其中pred: T =&gt; Boolean,它输出带有失败索引和谓词的信息性错误消息,类似于

    - should check that items satisfy predicate *** FAILED ***
      forAll failed, because: 
        at index 4, pred(x) was false (HelloSpec.scala:41) 
      in List(1, 2, 3, 4, 5, 6) (HelloSpec.scala:41)
    
    

    【讨论】:

      【解决方案2】:
        List(1,2,3,4,5,6).foreach { _ should be < 5 }
      

      【讨论】:

      • 没试过,但你确定它可以解析吗?不知何故,我觉得它应该是should be &lt; 5,就像在这个example about beWithinTolerance 中一样。 value(_) method(should) value(be) method(&lt;) value(5),否则方法调用和值不会交替。
      • @AndreyTyukin 是的,你是对的......我永远不知道在每种特定情况下哪种方式会编译,只需要尝试一个看看:)
      • 我更新了评论:实际上很容易发现,因为早期的所有 scala-edsl 总是具有expression methodName expression methodName expression 等的结构。我没有“记住”任何东西关于shouldBeshould be,我只是检查了它是否交替。
      • 是的......仍然要记住should是一种方法,而be不是......而shouldBe仍然是:D
      【解决方案3】:

      你可以改变问题

      "检查项目是否满足谓词"

      "检查列表中的所有项目是否小于5"

      然后答案就更有意义了。

      想要更有意义的答案,可以拨打fail,点赞

      fail("I've got a bad feeling about this.")
      

      您还可以通过多种方式使用断言,请阅读this 了解更多信息。示例:

      assume(database.isAvailable, "The database was down again")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-28
        • 2015-10-03
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多