Как я могу использовать встроенные в Monocle юридические реализации для проверки своих объективов?
Я заметил, что в 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 (или Boolean).
Я также вижу, что в фреймворке используется функция checkAll для одновременного тестирования всех LensLaws, но я также не смог заставить это работать в моем собственном коде. Любая помощь приветствуется.
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))
}
Оказывается, главной проблемой были мои относительно короткие знания о скалестате. checkAll - это средство проверки, предоставляемое org.typelevel.discipline.scalatest.Discipline, которое работает только в FunSuite (не в FlatSpec, который я использовал). Мне понадобились годы, чтобы понять это...
До сих пор не знаю, как элегантно использовать этот RuleSet (LensTests) в другой спецификации. Кажется странным, что выбор RuleSet от Monocle привел бы к применению стиля Spec в проекте с использованием этих тестов.