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

标签 specs2

我似乎无法让 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(这是一个更一般的概念)。前者使用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/

相关文章:

scala - 如何在specs2中断言对象的类型

scala - Play 2 : How to do execute piece of code before each test using specs2

scala - specs2 中的最终清理

scala - 嵌入式ES实例在运​​行单元测试时失败

scala - 戏剧中的 Specs2 测试给了我“找不到 org.specs2.main.CommandLineAsResult 类型的证据参数的隐式值

unit-testing - 执行封装在函数中的 specs2 示例

scalaz - 使用 specs2 和 scalaz-scalacheck-binding 来测试法律

scala - 如何使用 Spray 创建带有表单字段内容的 POST 请求?

macos - OSX 上的 Specs2 - 错误 : object specs2 is not a member of package org