使用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,但我找不到任何关于此行为的信息。
发布于 2021-05-29 19:45:01
这可能应该被更好地记录下来。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发布于 2021-05-29 01:08:42
解决方法:在Specification中混合使用AllExpectations
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。
https://stackoverflow.com/questions/67738175
复制相似问题