1

我一起使用 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)
        }
}

但是,当所有生成的开始和结束都不满足条件时,就会有测试失败的可能性。所以它几乎不是最好的解决方案(或者至少是一个好的解决方案)。

4

1 回答 1

2

您可以使用 scalatest 的 forAll 函数访问它们,如下所示:

  import org.scalatest.prop.GeneratorDrivenPropertyChecks._

  forAll (genPairs) { 
    case (start, end) => doSomething(start, end)
  }
于 2013-11-18T13:51:44.390 回答