【问题标题】:How can I use custom messages with mutable specs2 specifications?如何使用具有可变 specs2 规范的自定义消息?
【发布时间】:2017-01-28 07:07:04
【问题描述】:

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

我只是得到默认的失败消息“值为真”。这是通过 maven 使用 JUnitRunner 在 specs2 3.8.5 上的。我还没有在 sbt 项目上尝试过这个。我可以找到的文档表明这应该可行。

--- 编辑---

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

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

【问题讨论】:

    标签: specs2


    【解决方案1】:

    这里的主要问题来自您使用的是可变规范这一事实。在可变规范中,当结果不正确时会引发异常。在这种情况下,在您尝试设置不同的消息之前,测试就失败了(使用原始消息)。

    你有两个选择:

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

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

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

    您还会注意到设置/更新消息的 API 略有不同,具体取决于在 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")   
      

    【讨论】:

    • 谢谢@Eric。我相当肯定我看到了一些比 beFalse 更复杂的匹配器,这导致我将其简化为上述内容。如果我再次见到他们,我会在此处记下。然而,我已经重新组织了规范,并使用aka,因为它似乎更可靠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2019-11-12
    • 2020-10-03
    • 1970-01-01
    • 2020-12-13
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多