1

次の機能をテストしたい:

def curl(host: String, attempt: Int = 200): ZIO[Loggings with Clock, Throwable, Unit]

環境が のような標準の ZIO 環境のみを使用する場合Console with Clock、テストはそのままで機能します。

testM("curl on valid URL") {
      (for {
        r <- composer.curl("https://google.com")
      } yield
        assert(r, isUnit))
    }

テスト環境は によって提供されzio-testます。

Loggings問題は、モジュールで TestEnvironment を拡張する方法です。

4

2 に答える 2

1

この回答は RC17 用であり、RC18 では大幅に変更されることに注意してください。環境を構成する他の場合と同様に、モジュールから全体的な環境を構築するための関数を実装する必要があることは間違いありません。仕様にはprovideManaged、これを行うためのいくつかのコンビネータが組み込まれているため、テスト自体で行う必要はありません。これらにはすべて、スイート内の各テストに環境の個別のコピーを提供する「通常の」バリアントと、作成に費用がかかるリソースである場合にスイート全体の環境の 1 つのコピーを作成する「共有」バリアントがあります。 Kafka サービスのように。

provideSomeManagedテスト環境をテストに拡張する環境を提供するために使用する例を以下に示します。

RC18 では、ZIO のバリアントと同等のさまざまなバリアントが提供されるほか、ZIO アプリケーション用の構成環境の構築をはるかに容易にするレイヤーの新しい概念が提供されます。

import zio._
import zio.clock._
import zio.test._
import zio.test.environment._

import ExampleSpecUtil._

object ExampleSpec
    extends DefaultRunnableSpec(
      suite("ExampleSpec")(
        testM("My Test") {
          for {
            time <- clock.nanoTime
            _ <- Logging.logLine(
              s"The TestClock says the current time is $time"
            )
          } yield assertCompletes
        }
      ).provideSomeManaged(testClockWithLogging)
    )

object ExampleSpecUtil {

  trait Logging {
    def logging: Logging.Service
  }

  object Logging {

    trait Service {
      def logLine(line: String): UIO[Unit]
    }

    object Live extends Logging {
      val logging: Logging.Service =
        new Logging.Service {
          def logLine(line: String): UIO[Unit] =
            UIO(println(line))
        }
    }

    def logLine(line: String): URIO[Logging, Unit] =
      URIO.accessM(_.logging.logLine(line))
  }

  val testClockWithLogging
      : ZManaged[TestEnvironment, Nothing, TestClock with Logging] =
    ZIO
      .access[TestEnvironment] { testEnvironment =>
        new TestClock with Logging {
          val clock = testEnvironment.clock
          val logging = Logging.Live.logging
          val scheduler = testEnvironment.scheduler
        }
      }
      .toManaged_
}
于 2020-02-03T19:18:17.197 に答える