从 Scala REPL 访问 ZIO 测试生成器的最简单方法?

问题描述

我刚刚开始在 Scala 中使用 ZIO。我已经使用 ZIO 的 Gen 类型编写了一些 Scalacheck 样式的测试,它们似乎可以工作,但我想手动测试 REPL 中的生成器,以确保它们实际上生成了我期望的数据

问题:ZIO 中的所有内容都包装在 ZIO monad 中,我需要将正确的数据传递到这个 monad 中才能解包并查看结果。并且在 REPL 中没有解释如何执行此操作的文档。

我想我了解如何为没有环境依赖项的基本程序执行此操作:调用 zio.Runtime.default.unsafeRun。但是 Gen 对象需要 Random with Sized 类型的环境,我不知道如何生成它的实例。

给定一个 Gen[Random with Sized,T],在 REPL 上执行它并获得 List[T] 生成值的最快方法是什么?

解决方法

我想我已经找到了部分解决方案,但我并不完全满意。

对于仅从 REPL 上的 Gen 打印一些示例,这是有效的:

zio.Runtime.default.unsafeRun(
  yourGenerator
    .runCollectN(50)
    .provideLayer(zio.random.Random.live +!+ zio.test.Sized.live(100))
) foreach println

但我不认为这是应该完成的方式。 provideLayer 不会进行类型检查,除非我提供 RandomSized,即使 Random 应该是 zio.Runtime.default 的一部分。我认为 ZLayer 的某些方面我仍然不明白。