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