首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展ZIO测试的TestEnvironment

如何扩展ZIO测试的TestEnvironment
EN

Stack Overflow用户
提问于 2020-02-04 02:35:49
回答 2查看 242关注 0票数 1

我想测试以下函数:

代码语言:javascript
复制
def curl(host: String, attempt: Int = 200): ZIO[Loggings with Clock, Throwable, Unit]

如果环境只使用标准的ZIO环境,如Console with Clock,测试将开箱即用:

代码语言:javascript
复制
testM("curl on valid URL") {
      (for {
        r <- composer.curl("https://google.com")
      } yield
        assert(r, isUnit))
    }

测试环境将由zio-test提供。

所以问题是,如何用我的Loggings模块扩展TestEnvironment?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-04 03:18:17

请注意,此答案适用于RC17,并将在RC18中发生重大变化。你说得对,就像在组合环境的其他情况下一样,我们需要实现一个函数来从我们拥有的模块构建我们的整个环境。Spec有几个内置的组合子,比如provideManaged来做这件事,所以你不需要在你的测试中去做。所有这些都具有“普通”变体和“共享”变体,前者将为套件中的每个测试提供单独的环境副本,后者将在创建成本高昂的资源时为整个套件创建一个环境副本,如Kafka服务。

您可以在下面看到一个使用provideSomeManaged来提供将测试环境扩展到测试的环境的示例。

在RC18中,将有许多其他提供的变体,等同于ZIO上的那些变体,以及一个新的层概念,使为ZIO应用程序构建组合环境变得更加容易。

代码语言:javascript
复制
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_
}
票数 1
EN

Stack Overflow用户

发布于 2020-02-04 02:35:49

这就是我的想法:

代码语言:javascript
复制
testM("curl on valid URL") {
      (for {
        r <- composer.curl("https://google.com")
      } yield
        assert(r, isUnit))
        .provideSome[TestEnvironment](env => new Loggings.ConsoleLogger
           with TestClock {
           override val clock: TestClock.Service[Any] = env.clock
           override val scheduler: TestClock.Service[Any] = env.scheduler
           override val console: TestLogger.Service[Any] = MyLogger()
      })
    }

使用带有provideSomeTestEnvironment来设置我的环境。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60045180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档