在 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 而不是在每次调用或重要调用中每次都重复它?
也许这不是您所需要的,但您可以尝试覆盖 DefaultRunnableSpec
的 runner
方法并将主要上下文替换为 TrampolineExecutionContext
:
override def runner = {
super.runner.withPlatform( _.withExecutor(
Executor.fromExecutionContext(1)(
trampolineExecutionContext
)
))
}
在这种情况下,您在测试结束时只需要一个 on(trampolineExecutionContext)
而不是两个。
我正在尝试在 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 而不是在每次调用或重要调用中每次都重复它?
也许这不是您所需要的,但您可以尝试覆盖 DefaultRunnableSpec
的 runner
方法并将主要上下文替换为 TrampolineExecutionContext
:
override def runner = {
super.runner.withPlatform( _.withExecutor(
Executor.fromExecutionContext(1)(
trampolineExecutionContext
)
))
}
在这种情况下,您在测试结束时只需要一个 on(trampolineExecutionContext)
而不是两个。