1

我正在尝试在 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),我将仅因为我没有加入光纤(创建同步点)而获得“内部理解”。

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

4

1 回答 1

1

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

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

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

于 2020-09-13T04:32:31.043 回答