我一起使用ScalaTest和Scalacheck。这是我的懒对(它不起作用,因为这里我们得到Gen [(Int,Int)]而不是Tuples2所以我不能使用模式匹配):
private lazy val (startInterval, endInterval) =
for {
start <- Gen.choose(-10000, 10000)
end <- Gen.choose(-10000, 10000) if end > start
} yield (start, end)
为了使用forAll的两个参数,我想以这种方式使用上面提到的两个val:
forAll (endInterval, startInterval) { (start: Int, end: Int) =>
assert(sumOfCubes(start, end) === 0)
}
我可以用这种方式创建一个Gen [(Int,Int)]:
private lazy val genPairs =
for {
start <- Gen.choose(-10000, 10000)
end <- Gen.choose(-10000, 10000) if end > start
} yield (start, end)
但之后我无法按名称访问元素。
使用scalacheck很长一段时间可能是一个简单的问题,但我只是一个初学者并尝试了很多解决方案,所以 我知道如何解决这个问题?
修改 一种解决方案可以是随时使用:
private lazy val startInterval = Gen.choose(-10000, 10000)
private lazy val endInterval = Gen.choose(-10000, 10000)
和
forAll (startInterval, endInterval) { (start: Int, end: Int) =>
whenever(start > end) {
assert(sumOfCubes(start, end) === 0)
}
}
但是,当所有生成的开始和结束都不满足条件时,将有可能测试失败。所以这不是最好的解决方案(至少是好的解决方案)。
答案 0 :(得分:2)
您可以使用scalatest的forAll函数访问它们,如下所示:
import org.scalatest.prop.GeneratorDrivenPropertyChecks._
forAll (genPairs) {
case (start, end) => doSomething(start, end)
}