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

时间:2015-11-14 14:26:48

标签: scala scalatest lenses monocle-scala

我注意到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,但我也无法在我自己的代码中使用它。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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样式。