从specs2 helper方法返回类型

时间:2013-11-20 17:00:58

标签: scala specs2

假设我编写了一个辅助方法,它接受一些测试代码。

def testWithPrintln(test: => A):A = {
    println("I'm happy and testing")
    test
}

A类型应该是什么?什么是正确的?我正在浏览specs2 api并且有许多类似的外观类型:AsResult[_]ResultMatchResult[_],我混淆了使用的内容。< / p>

2 个答案:

答案 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,即SuccessFailureError或{{ 1}}或Skipped。为了提供足够的灵活性,Pending的正文将接受任何类型Example,只要T的实例可以转换为Result 1}}在(隐式)范围内。

有各种类型AsResult[T]的实例:

  • AsResult:这会使Boolean成为trueSuccess成为false

  • failure本身,只返回值

  • ResultMatchResult[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