如何使用具有可变 specs2 规范的自定义消息?

How can I use custom messages with mutable specs2 specifications?

我似乎无法让 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
    }
  }
}

我只收到默认的失败消息 "the value is true"。这是在 specs2 3.8.5 上通过 Maven 使用 JUnitRunner。我还没有在 sbt 项目上尝试过这个。我能找到的文档表明这应该有效。

--- 编辑 ---

某种解决方法:true.aka("this should PRINT").must(beFalse) // works

在实践中用于描述复杂的故障时,打印出来的效果有点难看,但至少它打印出来了,所以我可以添加必要的额外上下文以更容易地理解故障。

这里的主要问题是您使用的是可变规范。在可变规范中,当结果不正确时会抛出异常。在这种情况下,甚至在您尝试设置不同的消息之前,测试都会失败(使用原始消息)。

您有 2 个选择:

  • 在匹配器本身上设置消息

    false must beTrue.setMessage("ko")
    
  • org.specs2.execute.AsResult捕获结果 (这会捕获异常)

    AsResult(false must beTrue).updateMessage("ko")
    

您还会注意到 API 到 set/update 消息略有不同,具体取决于 MatchResult(有匹配的实体)和 Result(这是一个更一般的概念)。前者使用setMessage,后者使用updateMessage.

并且,郑重声明,还有其他方法可以为给定故障添加更多信息:

  • 使用aka描述您注意到的实际值

  • 用一句话形容满满的期待

    "Values are correct" ==> {
      values must beCorrect
    } 
    
  • 创建一个新匹配器

    def myMatcher: Matcher[Int] = (i: Int) =>
      (test(i), s"what's wrong with $i")