首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以让Specs2 Result.foreach像匹配器一样工作吗?

可以让Specs2 Result.foreach像匹配器一样工作吗?
EN

Stack Overflow用户
提问于 2021-05-28 19:42:59
回答 2查看 58关注 0票数 0

使用Specs2,如果我这样做:

代码语言:javascript
复制
    1 must beEqualTo(2)
    1 must beEqualTo(1)

测试失败(不出所料)

如果我这样做了:

代码语言:javascript
复制
    Result.foreach(1 to 10) { i =>
      i must_== 2
    }
    Result.foreach(1 to 10) { i =>
      i must_== i
    }

测试通过

对于Result.foreach,我必须使用and来使测试失败(不出所料):

代码语言:javascript
复制
    Result.foreach(1 to 10) { i =>
      i must_== 2
    } and
    Result.foreach(1 to 10) { i =>
      i must_== i
    }

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

我检查了Specs2 user guide,但我找不到任何关于此行为的信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-29 19:45:01

这可能应该被更好地记录下来。Result.foreach函数确实被认为是无副作用的。如果你想要副作用,你可以在你的规范中直接调用foreach,因为这与可变规范的“抛出”行为是绑定在一起的:

代码语言:javascript
复制
class TestMutableSpec extends mutable.Specification {

  "foreach must fail" >> {
    foreach(1 to 10) { i =>
      i must_== 2
    }
    foreach(1 to 10) { i =>
      i must_== i
    }
  }
}

返回

代码语言:javascript
复制
[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
票数 2
EN

Stack Overflow用户

发布于 2021-05-29 01:08:42

解决方法:在Specification中混合使用AllExpectations

代码语言:javascript
复制
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
    }
  }
}

这会产生以下结果:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67738175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档