假设:
<%@ 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: String
或foo
。
答案 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)