如何在 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"
}
}
我已经检查了 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"
}
}