#scala #testing #zio #trampolines
#scala #тестирование #zio #батуты
Вопрос:
Я пытаюсь использовать TrampolineExecutionContext в ZIO, чтобы протестировать подписки на фоновый поток в том же потоке (чтобы я мог запускать effect в порядке, который я ожидаю).
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, не повторяя его каждый раз при каждом вызове или в важных вызовах?
Ответ №1:
Возможно, это не совсем то, что вам нужно, но вы можете попробовать переопределить runner
метод DefaultRunnableSpec
и заменить основной контекст на TrampolineExecutionContext
:
override def runner = {
super.runner.withPlatform( _.withExecutor(
Executor.fromExecutionContext(1)(
trampolineExecutionContext
)
))
}
В этом случае вам понадобится только один on(trampolineExecutionContext)
в конце теста вместо двух.