この回答は 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_
}