【发布时间】: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)
【问题讨论】: