【问题标题】:Can Specs2 Result.foreach be made to work like a matcher?Specs2 Result.foreach 可以像匹配器一样工作吗?
【发布时间】:2021-08-16 15:51:40
【问题描述】:

如果我这样做,请使用 Specs2:

    1 must beEqualTo(2)
    1 must beEqualTo(1)

测试失败(如预期)

如果我这样做:

    Result.foreach(1 to 10) { i =>
      i must_== 2
    }
    Result.foreach(1 to 10) { i =>
      i must_== i
    }

测试通过

对于Result.foreach,我必须使用and 使测试失败(如预期的那样):

    Result.foreach(1 to 10) { i =>
      i must_== 2
    } and
    Result.foreach(1 to 10) { i =>
      i must_== i
    }

这是为什么? 有没有办法让它以一种不那么令人惊讶的方式工作?这很容易出错 - 很容易不注意到有人没有输入and

我检查了Specs2 user guide,但没有提到我能找到的这种行为。

【问题讨论】:

    标签: scala unit-testing collections specs2


    【解决方案1】:

    这可能应该得到更好的记录。 Result.foreach 函数确实应该没有副作用。如果你想要副作用,你可以直接在你的规范中调用foreach,因为这与可变规范的“抛出”行为有关:

    class TestMutableSpec extends mutable.Specification {
    
      "foreach must fail" >> {
        foreach(1 to 10) { i =>
          i must_== 2
        }
        foreach(1 to 10) { i =>
          i must_== i
        }
      }
    }
    

    返回

    [info] TestMutableSpec
    [error] x foreach must fail
    [error]  There are 9 failures
    [error]  1 != 2
    [error]  3 != 2
    [error]  4 != 2
    [error]  5 != 2
    [error]  6 != 2
    [error]  7 != 2
    [error]  8 != 2
    [error]  9 != 2
    [error]  10 != 2 (TestSpec.scala:19)
    [info] Total for specification TestMutableSpec
    [info] Finished in 121 ms
    [info] 1 example, 1 failure, 0 error
    

    【讨论】:

    • 感谢您的回复,但您在上面发布的内容是“调用 foreach ... 因为 [它] 与可变规范的“抛出”行为相关联”与用户指南链接相矛盾,该链接说:“你不能在……可变的[规范]中使用[foreach]”还是我完全误解了?
    • foreach 是集合上的方法,而上面示例中使用的 foreach 具有不同的签名。它继承自Specification trait,并将集合作为参数。
    • 感谢@Eric,我认为该页面上的foreach 指的是收集方法和来自Specification! 的方法。我现在明白了
    【解决方案2】:

    解决方法:将AllExpectations 混入您的Specification

    class QuickStartSpec extends mutable.Specification with AllExpectations {
      "foreach must fail" >> {
        Result.foreach(1 to 10) { i =>
          i must_== 2
        }
        Result.foreach(1 to 10) { i =>
          i must_== i
        }
      }
    }
    

    这会产生:

    sbt> testOnly QuickStartSpec
    [info] QuickStartSpec
    [error] x foreach must fail
    [error]  1 != 2 (QuickStartSpec.scala:8)
    

    注意:我知道这不是 AllExpectations 特征的主要目的。然而,这似乎是一个明智的解决方案,因为 Result.foreach 的行为方式与可变规范中的匹配器不同。

    另外,according to the docs,“单元规范”的目标是让用户对每个示例有多个期望,而无需使用and。鉴于此,Result.foreach 的行为确实似乎具有误导性。如果你认为这是一个错误,你可以考虑opening an issue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2015-11-08
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多