Я нахожу использование specs2 с scalacheck для проверки законов Monoid, немного уродливых, когда вы пытаетесь использовать библиотеку привязки scalazck scalazck. В моем коде используется скаляр Моноид, поэтому я хотел использовать их законы, чтобы проверить, что MyType реализует их.с использованием specs2 с привязкой scalaz-scalacheck к законам тестов
Эта уродство заставляет меня думать, что я пропускаю что-то или неправильно использую API Specs2 или scalacheck-binding API. Сушестились.
Это то, что я сделал: -
Я использую specs2 3,7 с scalaz 2.7.0
Читая инструкцию на «http://etorreborre.github.io/specs2/guide/SPECS2-3.0/org.specs2.guide.UseScalaCheck.html» я продлил свою спецификацию с Scalacheck
признака и у меня есть Arbitrary[MyType]
в области, поэтому я должен иметь возможность использовать scalacheck OK.
Док упоминалось выше гласит, что мне нужно передать функцию методу prop
до тех пор, как прошло функция возвращает Result
где scalacheck-х Prop
является действительным Result
scalacheck связывания апи дает мне monoid.laws[T]
функцию что возвращает Properties
, который является Prop
так что это должно быть в порядке, она также принимает неявные параметры типов Monoid[T]
, Equal[T]
и Arbitrary[T]
все из которых я имею в сфере, где T
является MyType
Я хочу, чтобы это сделать:
class MyTypeSpec extends Specification with ScalaCheck {
def is = s2"""
MyType spec must :-
obey the Monoid Laws $testMonoidLaws
"""
def testMonoidLaws = {
import org.scalacheck.{Gen, Arbitrary}
import scalaz.scalacheck.ScalazProperties._
implicit val arbMyType: Arbitrary[MyType] = genArbMyTpe() // an helper Arbitrary Gen func i have written
prop { monoid.laws[MyType] }
}
}
но prop
cannot be applied to (org.scalacheck.Properties)
Это требует Т в Произвольном быть типом в параметре функции, так что я сделал это, заметьте, я TRow прочь параметр т , ...
class MyTypeSpec extends Specification with ScalaCheck {
def is = s2"""
MyType spec must :-
obey the Monoid Laws $testMonoidLaws
"""
def testMonoidLaws = {
import org.scalacheck.{Gen, Arbitrary}
import scalaz.scalacheck.ScalazProperties._
implicit val arbMyType: Arbitrary[MyType] = genArbMyTpe() //some Arbitrary Gen func
prop { (t: Path => monoid.laws[MyType] }
}
}
Мой тест проходит. ура! Так в чем проблема?
Я не уверен в тестировании. Все, что он говорит, это прошло. Я не получаю никаких выходных данных, как если бы я использовал Scalacheck, рассказывая мне, какие законы он выполнял и прошел. Также я выбрасываю параметр t
и позволяю monoid.laws[MyType]
найти в видимой области видимости, что кажется неправильным. Работает? Я искал API specs2?
изменения MyType поэтому было бы определенно не в состоянии законы вызвали сбой при проверке, что это хорошо, но я до сих пор неловко, как это всегда терпит неудачу с
Falsified after 0 passed tests.
Я могу собрать Произвольное [MyType], делая
prop { (p: Path) => monoid.laws[Path] }.collectArg(f => "it was " + f.shows)
затем запустить его, как так
sbt testOnly MyTypeSpec -- scalacheck.verbose
, который показывает мне собранные значения t
, когда он работает, но когда я выбрасываю t
Я не уверен, что это действительно вообще.
Есть ли лучший способ проверить использование Specs2 и скальсальных привязок scalaz, которые менее уродливы и выводит информацию, которая дает мне уверенность в том, что законы были опробованы и протестированы?
Благодаря
Karl
Спасибо Эрик. Мне было непонятно, что я могу просто вернуть Свойства непосредственно из документации, где все примеры использовали prop. – user2056182