Scala after() 方法中有没有办法知道测试是否失败?

Is there a way in a Scala after() method to know whether the test failed?

我有一个实现 BeforeAndAfter 的测试套件,理想情况下我希望能够在测试失败时检查我的 after() 方法,如果它确实计算了一些值并且打印出来。有内置的方法吗?

ps。我知道我可以围绕整个测试做 try/catch,但我宁愿不必那样做。

我认为您无法在 after() 中执行此操作,但您可以通过覆盖 withFixture() 来执行此操作。此方法运行实际测试,之后您可以匹配结果并在失败的情况下打印一些内容:

class ExampleSpec extends WordSpec with MustMatchers {

  "Example" must {
    "work correctly" in {
      3 must be(3)
    }

    "not fail" in {
      true must be(false)
    }
  }

  override def withFixture(test: NoArgTest) = super.withFixture(test) match {
    case failed: Failed =>
      val nameLen = test.name.length
      info(s"The test '${test.name}' failed")
      info(s"The test name is $nameLen characters long")
      failed
    case other => other
  }
}

参见 Sharing Fixtures,尤其是 "Overriding withFixture(NoArgTest)"

部分

根据您的需要,您可以:

1) 写类似 def around[T](code: => T) = try {code} ... 的东西并像这样使用它:

    test("mytest") {
       around {

       }
    }

    it should "blabla" in around {
       ...
    }

2) 如果您不使用规范,那么只需编写您自己的规范即可:

    def mytest[T](name: String)(code: =>T) = test(name){
      try {
        code
      } ...
    }

或直接覆盖 test:

   override def test[T](name: String)(code: =>T) = super.test(name){
      try {
        code
      } ...
    }

两者都可以在单独的特征中完成,顺便说一句。

3) 按照@alextsc 的回答

覆盖withFixture

4) 如果您想拦截构建中的所有测试,请编写您自己的 reporter

P.S。 BeforeAndAfter/withFixture 旨在清理资源(这就是为什么他们不给你任何异常访问权限),所以如果你需要分析和重新表示你的错误,逻辑上记者解决方案可能更适合,但它不是很方便。