在specs2中编写测试用例时,我遇到了这段代码。
abstract class WithDbData extends WithApplication {
override def around[T: AsResult](t: => T): Result = super.around {
setupData()
t
}
def setupData() {
// setup data
}
}
"Computer model" should {
"be retrieved by id" in new WithDbData {
// your test code
}
"be retrieved by email" in new WithDbData {
// your test code
}
}
这是link。
请解释super.around
在这种情况下的工作原理?
答案 0 :(得分:2)
班级around
中的WithApplication
方法具有以下签名:
def around[T](t: ⇒ T)(implicit arg0: AsResult[T]): Result
让我们忽略隐含的论证,这对于这个解释并不感兴趣。
它需要call-by-name parameter (t: ⇒ T)
,并且在around
类的WithDbData
方法中,它会被一个块调用,这是{ ... }
之后的super.around
{1}}。该块是作为参数t
传递的。
另一个简单的例子,说明你可以用这个做什么:
// Just using the name 'block' inside the method calls the block
// (that's what 'call-by-name' means)
def repeat(n: Int)(block: => Unit) = for (i <- Range(0, n)) {
block // This calls the block
}
// Example usage
repeat(3) {
println("Hello World")
}