Почему невозможно извлечь слои в переменной в ZIO Test
Предоставляя слои для моих тестов, я наткнулся на такое странное поведение, что невозможно извлечь слои в значении.
Этот код компилируется:
def spec: ZSpec[environment.TestEnvironment, Any] =
suite("EnvironmentLoaderSuites")(
testM("the Config is correct") {
assertM(environmentLoader.bpfEnv())(
equalTo(expectedEnv))
}
).provideCustomLayer(Console.live >>> loggings.consoleLogger >>> environmentLoader.live(testEnvPath))
Когда я теперь извлекаю слои следующим образом:
val layers = Console.live >>> loggings.consoleLogger >>> environmentLoader.live(testEnvPath)
def spec: ZSpec[environment.TestEnvironment, Any] =
suite("EnvironmentLoaderSuites")(
testM("the Config is correct") {
assertM(environmentLoader.bpfEnv())(
equalTo(expectedEnv))
}
).provideCustomLayer(layers)
Я получаю следующее исключение компиляции:
Error:(48, 26) type mismatch;
found : zio.ZLayer[Any,Throwable,finnova.bpf.client.environmentLoader.EnvironmentLoader]
(which expands to) zio.ZLayer[Any,Throwable,zio.Has[finnova.bpf.client.environmentLoader.Service]]
required: zio.ZLayer[zio.test.environment.TestEnvironment,zio.test.TestFailure[Any],?]
(which expands to) zio.ZLayer[zio.Has[zio.clock.Clock.Service] with zio.Has[zio.console.Console.Service] with zio.Has[zio.system.System.Service] with zio.Has[zio.random.Random.Service] with zio.Has[zio.blocking.Blocking.Service] with zio.Has[zio.test.Annotations.Service] with zio.Has[zio.test.environment.TestClock.Service] with zio.Has[zio.test.environment.TestConsole.Service] with zio.Has[zio.test.environment.Live.Service] with zio.Has[zio.test.environment.TestRandom.Service] with zio.Has[zio.test.Sized.Service] with zio.Has[zio.test.environment.TestSystem.Service],zio.test.TestFailure[Any],?]
).provideCustomLayer(layers)
Это ограничение ZIO Test или я что-то пропустил?
1 ответ
Решение
Я считаю, что вам нужно поднять тип отказа вашего слоя до TestFailure
. Вы можете сделать это с помощьюlayer.mapError(TestFailure.fail)
. Когда вы предоставили его напрямую, компилятор, возможно, расширил тип, поскольку он еще не был полностью известен, тогда как теперь, поскольку вы определили промежуточныйval
тип полностью определен.