如何在 ScalaTest 中正确测试 Try[T]?

How to test a Try[T] in ScalaTest correctly?

我已经检查了 post 中指定的答案

但是如果我必须在函数调用之后做任何断言,或者如果我必须检查 for { } yield { } 块中的断言,那么我将遵循下面给出的方法:

  def test(a: Int, b: Int): Try[Int] = Try {
    a / b
  }

  it.should("succeed").in {
    (for {
      res <- test(0, 1)
    } yield {
      assert(res === 0)
      // assume more assertions are to be made
    }) match {
      case Success(value)     => value
      case Failure(exception) => fail(exception)
    }
  }

  it.should("fail").in {
    test(1, 0).failure.exception.getClass.mustBe(classOf[java.lang.ArithmeticException])
  }

上述方法的问题在于,对于成功案例,如果单元测试逻辑中出现任何问题,那么它将显示错误指向行 case Failure(exception) => fail(exception) 而不是实际所在的行错误发生。如果测试用例很大,那么用户将很难找到错误发生的确切位置。

那么有没有更好的方法来对 returns 和 Try[T] 的函数进行单元测试而不将断言移到 for { } yield { } 块之外?

TryValues 特性(已记录 here)旨在帮助解决此问题:

class MyTestSpec extends FlatSpec with Matchers with TryValues {
  "tryTest" should "succeed" in {
    // Normal tests
    test(0, 1).isSuccess shouldBe true
    test(1, 1).isFailure shouldBe true

    // Use TryValues conversions
    test(0, 1).success.value shouldBe 0
    test(1, 1).failure.exception should have message "should be zero"
  }
}