我似乎无法让 specs2 打印任何自定义消息。
import org.junit.runner.RunWith
import org.specs2.mutable.Specification
import org.specs2.runner.JUnitRunner
@RunWith(classOf[JUnitRunner])
class MessageSpecs extends Specification {
"This" should {
"fail" in {
true.must(beFalse).setMessage("this should PRINT")
//true.must(beFalse.setMessage("this should PRINT")) // or maybe this? no.
//true.must(beFalse).updateMessage(_ => "this should PRINT") // not this either
}
}
}
我只是收到默认的失败消息“值为真”。这是在 specs2 3.8.5 上通过 Maven 使用 JUnitRunner。我还没有在 sbt 项目上尝试过这个。我可以找到的文档表明这应该有效。
--- 编辑 ---
某种解决方法:true.aka("this should PRINT").must(beFalse)//有效
在实践中用于描述复杂的故障时,打印出来的效果有点难看,但至少它打印出来了,所以我可以添加必要的额外上下文以更容易地理解故障。
最佳答案
这里的主要问题是您使用的是可变规范。在可变规范中,当结果不正确时会抛出异常。在这种情况下,甚至在您尝试设置不同的消息之前,测试都会失败(使用原始消息)。
你有两个选择:
在匹配器本身上设置消息
false must beTrue.setMessage("ko")
使用
org.specs2.execute.AsResult
捕获结果 (这会捕获异常)AsResult(false must beTrue).updateMessage("ko")
您还会注意到,根据在 MatchResult
(有匹配的实体)和 Result上设置消息,设置/更新消息的 API 略有不同
(这是一个更一般的概念)。前者使用setMessage
,后者使用updateMessage
。
而且,作为记录,还有其他方法可以为给定故障添加更多信息:
使用
aka
描述您注意到的实际值用一句话形容满满的期待
"Values are correct" ==> { values must beCorrect }
创建一个新的匹配器
def myMatcher: Matcher[Int] = (i: Int) => (test(i), s"what's wrong with $i")
关于specs2 - 如何使用具有可变 specs2 规范的自定义消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41886248/