Gen [String]能否产生其他价值?

时间:2016-06-02 18:35:45

标签: scala scalatest scalacheck

假设:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="main"/>
<title>Demo Test Run Results</title>
</head>
<body>
  <div class="body">

  </div>
</body>
</html>

运行import org.scalatest._ import org.scalatest.prop.Checkers import org.scalacheck.Gen import org.scalacheck.Gen._ object Test { def fooOrBar: Gen[String] = oneOf("foo", "bar") } class Test extends FunSuite with Checkers { import Test._ test("generated String should equal 'foo' or 'bar'") { check( org.scalacheck.Prop.forAll(fooOrBar) { x: String => x == "foo" || x == "bar" }) } } 会返回所有测试都已成功。

鉴于上述代码,sbt test x: String String类型fooOrBar的{​​{1}}是否可能等于Gen[String]以外的值}或foo

在我的真实世界代码中,我看到bar的值似乎与x: String参数不同Gen[String]

所以,这就是为什么我要问是否可能,对于上面的例子,org.scalacheck.Prop.forAll是否不能等于x: Stringfoo

1 个答案:

答案 0 :(得分:1)

当ScalaCheck发现一些伪造属性的数据时,它会尝试“缩小”数据以找到一个较小的反例。不幸的是,在此过程中可能会丢失一些Gen约束。这是known issue

使用forAllNoShrink代替forAll,可以解决缩小问题的方法。

另一个解决方案是specify a postcondition on the generator with suchThat。例如,请参阅Gen.oneOf

的定义
def oneOf[T](xs: Seq[T]): Gen[T] =
  choose(0, xs.size-1).map(xs(_)).suchThat(xs.contains)