0

在处理zio-spark时,我们不能在未使用的测试中竞争效果zio.Clock。效果不会中断。有没有办法解决这个问题?

package zio.spark.effect

import zio._
import zio.test.TestAspect.timeout
import zio.test._


object WeirdClocks extends DefaultRunnableSpec {
  def wait(seconds: Int): UIO[Int] = UIO(Thread.sleep(seconds * 1000)).as(seconds)

  override def spec: ZSpec[TestEnvironment, Any] = suite("clock")(
    test("raceTest") {
      wait(5).race(wait(15)) map (n => assertTrue(n == 5))
    } @@ timeout(10.seconds)
  )
}
4

1 回答 1

1

这是预期行为,与 ZIO Test 或Clock.

ZIO中的中断直到效果中断成功后才返回,这是资源安全的重要保证。在wait(5).race(wait(15)), wait(5)5 秒后赢得比赛。在这一点上race试图打断wait(15)。但是,中断通常发生在效果“之间”并且wait(15)是单个副作用代码块,因此通常无法安全地中断它。结果,中断暂停,直到wait(15)完成执行,但此时已经过去了 15 秒,并且测试已经超时。

如果您不想等待中断完成,您可以使用disconnect运算符,例如wait(5).race(wait(15).disconnect). 通过此更改,您的测试将按书面方式通过。您还可以使用attemptBlockingInterrupt来指示 ZIO 运行时尝试通过中断底层线程来中断像这样的单个副作用代码块,尽管这是相对重量级的。

于 2022-03-05T19:45:19.670 回答