2012-10-05 33 views
2

我该如何使用ScalaCheck编写Gen[A],它永远不会返回两次相同的对象?没有替换的ScalaCheck选择

Gen.oneOf(a,b,c) 

可以重复选择相同的对象,以至于不起作用。

我在specs2中编写了一个可变规范,我想这样做的原因是因为被测系统的行为应该只允许每个对象在某种意义上被“使用”一次。

编辑:通过“相同的”我的意思是相同的,根据==,而对象实际上是字符串,所以我不能只是创建相同的字符串每次。

+0

你真的需要为发电机?元素的选择顺序是否随机很重要? – Eric

+0

@Eric是的,因为否则某些代码路径可能不会被执行。 –

回答

2

我不完全确定你在问什么,但是有一个名为Gen.wrap的生成器组合器,它在每次评估生成器本身时评估其参数。这样,你可以强制创建新的对象。见下面的例子(注意,你可以跳过使用Gen.value,如果你想,而不是依赖于隐式转换A => Gen[A]):

scala> import org.scalacheck._ 
import org.scalacheck._ 

scala> class A 
defined class A 

scala> val g1: Gen[A] = Gen.value(new A) 
g1: org.scalacheck.Gen[A] = Gen() 

scala> g1.sample.get 
res0: A = [email protected] 

scala> g1.sample.get 
res1: A = [email protected] 

scala> val g2: Gen[A] = Gen.wrap(Gen.value(new A)) 
g2: org.scalacheck.Gen[A] = Gen() 

scala> g2.sample.get 
res2: A = [email protected] 

scala> g2.sample.get 
res3: A = [email protected] 
+0

啊,是的,我可以看到这是如何有用的,但这不是我想要的 - 查看我的问题的更新。 –

+0

啊,现在我明白了 - 我可以将它与_any_ generator结合使用,这样我就可以编写Gen.wrap(Gen.oneOf(myCollection))',然后在使用之前或之后从myCollection中删除项目。 –