Почему невозможно извлечь слои в переменную в тесте ZIO? - PullRequest
1 голос
/ 10 апреля 2020

Предоставляя слои для моих тестов, я наткнулся на странное поведение, состоящее в том, что невозможно извлечь слои в значение.

Этот код компилируется:

  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 Ответ

2 голосов
/ 10 апреля 2020

Я считаю, что вам нужно поднять тип ошибки вашего слоя до TestFailure. Вы можете сделать это с layer.mapError(TestFailure.fail). Когда вы предоставили его напрямую, компилятор, возможно, расширил тип, поскольку он еще не был полностью известен, тогда как теперь, когда вы определили промежуточное значение val, тип полностью определен.

...