1

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

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

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

其中 l 是 Monocle 镜头,在范围内可见。我收到以下错误消息:

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

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

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

4

1 回答 1

1

以下对我有用

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)。我花了很长时间才弄清楚...

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

于 2015-11-15T20:36:51.443 回答