Scala,ZIO - 如何测试效果是否返回成功?

Scala, ZIO - how to test if effect returned success?

我有一个检查模拟服务的简单测试代码:

 runtime.unsafeRun(service.run.forkDaemon)
    eventually(Timeout(Span(5, Seconds)), Interval(Span(1, Seconds))) {
      verify(someMockResult).create(any[String], any[String])
    }

service returns Task[Done]。它工作正常,但我也想检查一下是否 unsafeRun returns succeed。我试着这样做:

runtime.unsafeRun(service.run.forkDaemon) shouldBe succeed

或:

val result = runtime.unsafeRun(service.run.forkDaemon)
   eventually(Timeout(Span(5, Seconds)), Interval(Span(1, Seconds))) {
      result shouldBe succeed
   }

但它不起作用。有什么方法可以检查效果结果是否成功?

首先,你误解了org.scalatest.Succeed(别名为succeed)的意思。仅当您需要使用 Assertion 类型结束函数体时才需要它。基本上等于assert(true)。这不是一个实际测试某些东西的断言。

如果我理解正确,您想检查我们定义为 testTask 的执行情况:

val testTask: Task[Done] = service.run.forkDaemon

val res = runtime.unsafeRun(testTask) 同步执行 的代码中存在问题。这意味着这行代码的评估有两种可能的结果:1) 它成功执行 testTask 并将结果分配给 res 变量,或者 2) testTask 的执行失败,并且它抛出异常。

所以,基本上,如果没有异常,就成功了。

另一种更方便地检查这一点的方法是将其评估为 Futureruntime.unsafeRunToFuture,然后断言 future 最终成功。例如,您可以这样做:

assert(
  future.value match { 
    case Some(Success(_)) => true 
    case _ => false
  }
)