如何正确使用ScalaTest测试Try[T]?
我有一个返回如何正确使用ScalaTest测试Try[T]?,scala,scalatest,Scala,Scalatest,我有一个返回Try对象的方法: def doSomething(p: SomeParam): Try[Something] = { // code } 我现在想用ScalaTest测试一下。目前我是这样做的: "My try method" should "succeed" in { val maybeRes = doSomething(SomeParam("foo")) maybeRes.isSuccess shouldBe true val res = maybeRes.g
Try
对象的方法:
def doSomething(p: SomeParam): Try[Something] = {
// code
}
我现在想用ScalaTest测试一下。目前我是这样做的:
"My try method" should "succeed" in {
val maybeRes = doSomething(SomeParam("foo"))
maybeRes.isSuccess shouldBe true
val res = maybeRes.get
res.bar shouldBe "moo"
}
然而,检查issucess
是否为true
看起来有点笨拙,因为对于选项和序列,有一些东西像应该是(空的)
和不应该是(空的)
。我找不到类似应该(成功)
的东西
这是否存在,或者我的方法真的是要走的路吗?只需检查它是否是带有返回值的成功类型:
maybeRes shouldBe Success("moo")
或者
import org.scalatest.TryValues._
// ...
maybeRes.success.value should be "moo"
另一种可能性是这样做
import org.scalatest.TryValues._
maybeRes.success.value.bar shouldBe "moo"
这将给出一条消息,指示Try
未成功,而不是在maybeRes.get
中引发异常
选项
,或者
或者部分功能(使用相关导入)@rabejens的模拟存在让失败的try错误在ScalaTest报告管道中传播的正确方法是maybeRes.success.value应该是“moo”
,您可以通过混合tryvalue
得到它。上面的答案是错误的,因为当你故意隐藏错误时,会报告精度损失。@flavian,这就是为什么我将Cyrille Corpet的答案标记为正确答案的原因。不幸的是scalatest不支持这一最佳答案。显然,这是一个比处理tryValue更简单的语义。这是我真正想要的——测试是否成功,并获得结果对象(这不仅仅是我真实代码中的字符串)以进行进一步测试。很高兴我能提供帮助。我发现这非常有用,因为您可以将其用于不同的错误处理上下文。如何检查失败?maybeRes.failure.exception应该有消息“/by zero”
,请参阅