在 ZIO 中设置默认执行上下文

Set default Execution Context in ZIO

我正在尝试在 ZIO 中使用 TrampolineExecutionContext 以测试同一线程上的后台流订阅(这样我就可以 运行 按我期望的顺序产生效果)。

testM("Using trampoline execution context") {
      (for {
        queue <- Queue.unbounded[String]
        _ <- ZStream
          .fromQueue(queue)
          .take(1)
          .foreach(el => ZIO.effect(println(s"In Stream $el")))
          .fork
        _ <- queue.offer("Element")
        _ <- ZIO.effect(println("Inside for comprehension")).on(trampolineExecutionContext)
      } yield {
        assert(1)(equalTo(1))
      }).on(trampolineExecutionContext)
    }

在这种情况下,我得到了我期望的结果:

“在流元素中”,“内部理解”

如果我删除 on(trampolineExecutionContext),我将获得“Inside for comprehension”只是因为我没有加入光纤(创建同步点)。

如何将整个测试的默认上下文设置为 trampolineExecutionContext 而不是在每次调用或重要调用中每次都重复它?

也许这不是您所需要的,但您可以尝试覆盖 DefaultRunnableSpecrunner 方法并将主要上下文替换为 TrampolineExecutionContext:

override def runner = {
  super.runner.withPlatform( _.withExecutor(
    Executor.fromExecutionContext(1)(
      trampolineExecutionContext
    )
  ))
}

在这种情况下,您在测试结束时只需要一个 on(trampolineExecutionContext) 而不是两个。