2

specs2 具有诸如BeforeAfterAround等特征,以便能够将示例包装在设置/拆卸代码中。

是否有任何东西支持为ScalaCheck 属性的每个“迭代”设置和拆除测试基础设施,即ScalaCheck 要测试的每个值或一组值?

看起来 specs2 的各种 Before、After、Around 特征都是围绕返回或抛出 specs2 Result 实例而设计的,而 Prop 不是 Result。

4

1 回答 1

2

这已在最新的 1.12.2-SNAPSHOT 中得到修复。你现在可以写:

import org.specs2.ScalaCheck
import org.specs2.mutable.{Around, Specification}
import org.specs2.execute.Result

class TestSpec extends Specification with ScalaCheck {
  "test" >> prop { i: Int =>
    around(i must be_>(1))
  }

  val around = new Around {
    def around[T <% Result](t: =>T) = {
      ("testing a new Int").pp
      try { t }
      finally { "done".pp }
    }
  }    
}

这将在属性的“主体”之前和之后执行代码。

您还可以更进一步,创建一个支持方法以将隐式传递around给您的 Props:

class TestSpec extends Specification with ScalaCheck {
  "test" >> propAround { i: Int =>
    i must be_>(1)
  }

  // use any implicit "Around" value in scope
  def propAround[T, R](f: T => R)
                      (implicit a: Around, 
                       arb: Arbitrary[T], shrink: Shrink[T], 
                       res: R => Result): Result =
    prop((t: T) => a(f(t)))

  implicit val around = new Around {
    def around[T <% Result](t: =>T) = {
      ("testing a new Int").pp
      try { t }
      finally { "done".pp }
    }
  }
}
于 2012-09-18T01:51:24.313 回答