Установить контекст выполнения по умолчанию в ZIO

#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) в конце теста вместо двух.