Specs2和@ Before/@ After-like方法

jde*_*lop 6 scala specs2

鉴于代码如下:

class RESTAcceptanceTest extends Specification {

  override def is = anonymous ^ signinOAuth

  def anonymous = "Something"       ^ givenSomething ^
                  "must happen"     ^ mustHappen 
  end

  def signinOAuth = "Signin"                ^ givenSignin ^
                    "works as expected"     ^ userExistsInDatabase 
  end

  // rest of object definitions

}
Run Code Online (Sandbox Code Playgroud)

如何确保在"anonymous" "signinOAuth" 之前/之后执行相同的代码之前和之后,即使测试失败,"after"方法也应该执行?

Eri*_*ric 3

如果您使用给定/何时/然后步骤,您可以使用上下文来控制每个示例之前和之后执行的内容:

import org.specs2._
import specification._

class MySpec extends Specification { def is = 
  "anonymous" ^ 
    "something" ^ something ^
    "must happen" ^ mustHappen ^ endp^
  "OAuth"^ 
    "signing" ^ signing ^
    "works ok" ^ worksOk

  lazy val something: Given[Int] = (s: String) => { s.pp; 1 } 
  lazy val mustHappen: Then[Int] = (i: Int) => (s: String)  => 
    context { s.pp; i must_== 1       }

  lazy val signing:  Given[Int] = (s: String) => { s.pp; 2 }
  lazy val worksOk: Then[Int] = (i: Int) => (s: String) => 
    context { s.pp; i must_== 2 }

  lazy val context = new BeforeAfter {
   def  before = "before".pp
   def after = "after".pp
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,对象apply的方法context用于包装要使用before和执行的代码after。此外,如果您向其中一个示例添加错误,您将看到“之后”代码始终被执行。

PS:pp是一个实用方法,例如println在执行过程中在终端中显示某些内容。相对于 println 的优点是它返回其参数,因此您可以编写1.pp must_== 1

  • 我已经更新了文档,但还启用了使用 `BeforeExample`、`AfterExample`...特征以及 Give/When/Then 步骤(在 Scala 2.9.2 的 1.12.4-SNAPSHOT 和 Scala 2.9.2 的 1.13.1-SNAPSHOT 中)斯卡拉 2.10)。请参阅文档:http://etorreborre.github.com/specs2/guide-SNAPSHOT/guide/org.specs2.guide.Structure.html#Contexts。 (3认同)