【问题标题】:How can I provide a custom header to a ZIO during tests如何在测试期间向 ZIO 提供自定义标头
【发布时间】:2021-11-12 22:56:17
【问题描述】:

我有返回 ZIO[Has[MyCustomHeader]] 的服务,但我无法对其进行测试。

我们组织中的其他服务通过使用 runtime.unsafeRunToFuture(其中运行时是 Runtime[ZEnv])将 ZIO 转换为 Twitterfuture 进行测试,然后等待未来,从而以阻塞模式运行测试。

但是,此服务有 Has[] 要求,而 runtime.unsafeRunToFuture 不处理这些要求。到目前为止,我的方法是尝试将我的 ZIO[Has[MyCustomHeader]] 转换为 ZIO[ZEnv],但我还没有成功。

据我所知,我需要通过ZIO.provideSomeLayer() 提供 ZLayer,但我太愚蠢了,无法理解如何正确构建 ZLayer?

我在这里走对了吗?如果是这样,我如何构造一个带有 MyCustomHeader 的静态值的 ZLayer 以在我的测试中使用?

这是我在尝试添加标题以进行测试方面的进展:它不起作用,但可能说明我想要实现的目标......也许......我自己很困惑:

object effectAwait {
  implicit class ZioEffect[A](private val value: ZIO[Has[EnvironmentHeader], RequestFailure, A]) extends AnyVal {
    final def await(implicit runtime: Runtime[ZEnv] = Runtime.default): A = {
      val zmanaged = ZManaged.fromEffect(value).provide(Has(EnvironmentHeader("test")))
      val layered =  value.provideSomeLayer(zmanaged.toLayer)
      val sf = runtime.unsafeRunToFuture(layered)

      Await.result(sf, 10.seconds)
    }
  }
}

然而,这给了我错误:

could not find implicit value for izumi.reflect.Tag[A]. Did you 
forget to put on a Tag, TagK or TagKK context bound on one of the 
parameters in A? e.g. def x[T: Tag, F[_]: TagK] = ...


<trace>: 
 deriving Tag for A, dealiased: A:
 could not find implicit value for Tag[A]: A is a type parameter without an implicit Tag!
     val layered =  value.provideSomeLayer(zmanaged.toLayer)

【问题讨论】:

    标签: scala testing zio


    【解决方案1】:

    我认为你可以在这里使用ZIO.provideLayer(而不是provideSomeLayer):)

    此外,还有一个 runtime.unsafeRun 也会等待结果,因此您不必将其转换为 Future。此外,除了依赖隐式运行时,总是有 zio.Runtime.default 可以在任何地方使用(它是 Runtime[ZEnv],所以它应该也能正常工作,除非你以其他方式自定义运行时的行为)

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 2022-12-01
      • 2018-09-21
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      相关资源
      最近更新 更多