在升级到
scalacheck 1.13.3之后,我遇到了一个奇怪的问题,即导出A =>的实例. B或C,其中Or本质上是一个光,或者几乎总是失败.
@H_502_30@解决方法
这是我可以编写的最简单的代码来重现该问题:
import org.scalatest.FunSuite import org.scalatest.prop.GeneratorDrivenPropertyChecks import org.scalacheck.Shapeless._ class Testor extends FunSuite with GeneratorDrivenPropertyChecks { sealed trait Or[+A,+B] extends Product with Serializable case class Left[A](a: A) extends Or[A,Nothing] case class Right[B](b: B) extends Or[Nothing,B] test("reproduce") { forAll { (i: Int,f: Int ⇒ Float Or Boolean) ⇒ f(i) } } }
这失败了:
RetrievalError was thrown during property evaluation. Message: couldn't generate value Occurred when passed generated values ( arg0 = 0,// 30 shrinks arg1 = <function1> )
请注意,提供明确的Arbitrary [Float或Boolean]可以解决问题,因此很明显问题出现在泛型推导中.
我不相信问题在于无形scalacheck – 我尝试编写自己的泛型推导来看看它是否有帮助,并且它以完全相同的方式失败了.
奇怪的东西,但可能是由于任意函数的工作方式,是函数实际生成,但在评估时失败.
非常感谢任何帮助/建议,因为我有点卡住了.
这个问题似乎是双面的:
> scalacheck(org.scalacheck.Test.Parameters.default)和scalatest中的默认测试参数的minSize为0.Prop.check尝试在启动时生成具有此大小的值.
> scalacheck-shapeless中的MkCoproductArbitrary.ccons在生成任意副产品时将大小零解释为终止条件,因此失败.
作为临时解决方法,在Travis的回复示例中,可以通过以下方式检查属性:
prop.check(Test.Parameters.default.withMinSize(1))
使用scalatest(在问题中使用),min size参数也可以改变,可能通过放置类似的东西
implicit val config = PropertyCheckConfiguration(minSize = PosZInt(1))
在测试用例之前(警告:我没有尝试/检查最新的解决方案,不像之前的纯scalacheck).