【问题标题】:How to test a Try[T] with ScalaTest correctly?如何正确使用 ScalaTest 测试 Try[T]?
【发布时间】:2017-10-22 02:23:50
【问题描述】:

我有一个返回 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"
}

但是检查isSuccess 是否为true 看起来有点笨拙,因为对于选项和序列,有should be(empty)shouldNot be(empty) 之类的东西。我找不到像should be(successful) 这样的东西。

这是否存在,或者我的方法真的可行吗?

【问题讨论】:

    标签: scala scalatest


    【解决方案1】:

    另一种可能是做

    import org.scalatest.TryValues._
    maybeRes.success.value.bar shouldBe "moo"
    

    这将给出一条消息,指示Try 不成功,而不是在maybeRes.get 中抛出异常。

    OptionEitherPartialFunction 存在模拟(使用相关导入)

    【讨论】:

    • 这才是我真正想要的——测试是否成功并获取结果对象(这不仅仅是我真实代码中的字符串)以进行进一步测试。
    • 很高兴我能帮上忙。我发现这真的很有帮助,因为您可以将它用于不同的错误处理上下文。
    • 如何检查失败?
    • maybeRes.failure.exception should have message "/ by zero",见scaladoc
    【解决方案2】:

    只需检查它是否是带有返回值的成功类型:

    maybeRes shouldBe Success("moo")
    

    【讨论】:

    • @rabejens 让失败的尝试错误在 ScalaTest 报告管道中传播的正确方法是 maybeRes.success.value shouldBe "moo",您可以通过混合 TryValues 来获得它。上面的答案是错误的,因为故意隐藏错误会报精度损失。
    • @flavian 这就是我将 Cyrille Corpet 的答案标记为正确答案的原因。
    • 不幸的是,scalatest 不支持将此作为最佳答案。显然,这是比处理 TryValues 更简单的语义。
    【解决方案3】:

    或者

    import org.scalatest.TryValues._
    
    // ... 
    
    maybeRes.success.value should be "moo"
    

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2016-05-12
      • 1970-01-01
      • 2020-01-27
      • 2012-05-20
      • 1970-01-01
      相关资源
      最近更新 更多