如何正确使用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”
,请参阅