specs2 - ScalaCheck 选择无需替换

标签 specs2 scalacheck

如何使用 ScalaCheck 编写一个永远不会返回同一对象两次的 Gen[A]

Gen.oneOf(a,b,c)

可以重复选择同一个对象,所以这是行不通的。

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

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

最佳答案

我不完全确定你在问什么,但是有一个名为 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 = A@45243a0f

scala> g1.sample.get
res1: A = A@45243a0f

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

scala> g2.sample.get
res2: A = A@331d4d66

scala> g2.sample.get
res3: A = A@728aed09

关于specs2 - ScalaCheck 选择无需替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12746196/

相关文章:

scala - 如何减少 ScalaCheck 生成的测试用例的数量?

Scalacheck 忽略提供的生成器

scala - scala 中的类型不匹配错误以供理解

scala - 如何在 Play 中强制输出 Logger.debug!框架规范2测试?

scala - 在 Scala Specs2 中重用 "await"参数

scala - Play Framework, Specs2 - 直接从单元测试调用 Controller 方法

scala - 验证是否使用 Mockito 调用了方法而不指定参数

scala - 使用 scalacheck 测试有效的状态转换

scala - 如何增加 scalacheck 控制台输出的字符列宽?

scala - 如何使用相互依赖的测试设计 Specs2 数据库测试?