假设我编写了一个辅助方法,它接受一些测试代码。
def testWithPrintln(test: => A):A = {
println("I'm happy and testing")
test
}
A
类型应该是什么?什么是正确的?我正在浏览specs2
api并且有许多类似的外观类型:AsResult[_]
,Result
,MatchResult[_]
,我混淆了使用的内容。< / p>
答案 0 :(得分:2)
我认为你要找的是org.specs2.execute.Result
。我相信这个简单的例子可以证明你的目标:
import org.specs2.mutable.Specification
import org.specs2.execute.Result
class PrintTest extends Specification{
"A request to do something" should{
"succeed like this" in testWithPrintln{
"foo" mustEqual "foo"
}
"also succeed like this" in {
testWithPrintln{
"foo" mustEqual "foo"
}
}
}
def testWithPrintln(test: => Result) {
println("I'm happy and testing")
test
}
}
我相信AsResult
类型用于基本类型(如布尔值)之间的隐式转换,它们本身不是Result
但可以转换为Result
。如果您查看AsResult
的javadoc注释,请说明:
Typeclass trait for anything that can be transformed to a Result
至于MatchResult
,我相信在使用Mockito使用存根时对params这样的事情进行匹配时会使用这个。在我的模拟存根中为params定义自定义匹配器时,我已经明确地使用了MatchResult
。
答案 1 :(得分:1)
试着详细说明@ cmbaxter的答案。
在规范2中,Example
的正文需要评估为Result
,即Success
或Failure
或Error
或{{ 1}}或Skipped
。为了提供足够的灵活性,Pending
的正文将接受任何类型Example
,只要T
的实例可以转换为Result
1}}在(隐式)范围内。
有各种类型AsResult[T]
的实例:
AsResult
:这会使Boolean
成为true
而Success
成为false
failure
本身,只返回值
Result
:MatchResult[T]
是匹配器执行的结果。这是结果
表达式,例如MatchResult
1 must beEqualTo(1)
在示例中执行ScalaCheck属性
在您的示例中,如果您按照以下方式实现它,测试帮助程序将正常工作:
org.scalacheck.Prop
但请注意,您要查找的帮助程序可能已存在于specs2中。您可以使用// if `a: A` is acceptable as the body of an example
// you can use testWithPrintln(a) in your example
def testWithPrintln[A : AsResult](a: A): A = {
println(a)
a
}
方法“打印并传递”任何值:
.pp
您还可以根据自己的期望添加更详细的消息:
// has type MatchResult[Int]
(1 must_== 1).pp