我如何使用 Monocle 的内置法实施来测试我自己的镜头?

How can I use Monocle's built in law implementations to test my own lenses?

我注意到 Monocle 实现了用于测试库内部结构的镜头法则。它们似乎被很好地概括和模块化。我试图用它们来测试我自己的镜头,但我迷失在依赖的丛林中。有没有人试过这样做,可以 post 举个例子吗?该文档似乎根本没有谈论法律。谢谢。

详细说明,这是我正在尝试做的事情(摸索着,不确定我是否使用了预期的方式来使用 API):

it should "pass the LensLaws" in check {
  forAll {(c: (String,Int), a: String) =>
    new monocle.law.LensLaws(l).setGet(c,a) }   }

其中 l 是单片眼镜,在瞄准镜中可见。我收到以下错误消息:

No implicit view available from monocle.internal.IsEq[String] => org.scalacheck.Prop

据我所知,setGet 法则构造了一个 IsEq 对象,但我无法找到如何将其转换为 Prop(或布尔值)的方法。

我还可以看到框架正在使用函数 checkAll 同时测试所有 LensLaws,但我也无法在我自己的代码中使用它。任何帮助表示赞赏。

以下对我有效

import org.scalatest.FunSuite
import org.typelevel.discipline.scalatest.Discipline

class LensesSuite extends FunSuite with Discipline {

  import scalaz._
  import Scalaz._

  checkAll("Lens l", monocle.law.discipline.LensTests(l))
}

原来主要问题是我对scalatest的了解比较浅。 checkAll 是 org.typelevel.discipline.scalatest.Discipline 提供的检查器,它只在 FunSuite 中有效(在我使用的 FlatSpec 中无效)。我花了很长时间才弄明白...

仍然不知道如何优雅地将此规则集 (LensTests) 用于另一个规范。 Monocle 选择 RuleSet 会在使用这些测试的项目上强制执行 Spec 风格,这似乎很奇怪。