斯卡拉-斯卡拉斯特-最终特质胜过失败断言?

时间:2019-03-13 09:19:34

标签: scala scalatest assertion

通过文档, eventually trait

  

重复调用传递的by-name参数,直到它   成功,或者经过了配置的最大时间休眠   两次尝试之间的配置间隔。

但是fail

  

无法无条件地失败的测试;

所以我想最终使用它来等待直到成功状态到达,但是如果我已经知道测试必须失败,请使用失败使测试失败

例如

使用ffmpeg转换视频,我将等到转换未完成,但是如果转换达到“错误”状态,我要使测试失败

通过此测试

  test("eventually fail") {
    eventually (timeout(Span(30, Seconds)), interval(Span(15, Seconds))) {
      println("Waiting... ")
      assert(1==1)
      fail("anyway you must fail")
    }
  } 

我知道我无法在最终提示中进行“无条件失败”测试:看起来最终将忽略“失败”直到超时。

enter image description here

这是正确的行为吗?

1 个答案:

答案 0 :(得分:1)

  

因此,在断言scalatest文档中,失败不应该“无条件地失败”,而是“引发异常”吗?

这是相同的,因为在Scalatest中测试失败的唯一方法是引发异常。

the source

def eventually[T](fun: => T)(implicit config: PatienceConfig): T = {
  val startNanos = System.nanoTime
  def makeAValiantAttempt(): Either[Throwable, T] = {
    try {
      Right(fun)
    }
    catch {
      case tpe: TestPendingException => throw tpe
      case e: Throwable if !anExceptionThatShouldCauseAnAbort(e) => Left(e)
    }
  }
  ...

因此,如果要解决故障,可以使用pending而不是fail(但当然,测试将被报告为未决,而不是失败)。或编写自己的eventually版本,让更多的异常通过。