访问scalacheck以不同的名称生成元组元素

时间:2013-11-18 13:41:38

标签: scala scalatest scalacheck

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

但是,当所有生成的开始和结束都不满足条件时,将有可能测试失败。所以这不是最好的解决方案(至少是好的解决方案)。

1 个答案:

答案 0 :(得分:2)

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

  import org.scalatest.prop.GeneratorDrivenPropertyChecks._

  forAll (genPairs) { 
    case (start, end) => doSomething(start, end)
  }