6

次のようなコードが与えられます:

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

}

「anonymous」と「signinOAuth」の前後で同じ前後のコードが実行され、テストが失敗した場合でも「after」メソッドが実行されるようにするにはどうすればよいですか?

4

2 に答える 2

3

Given/When/Then ステップを使用している場合は、Contextを使用して、各例の前後に実行される内容を制御できます。

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
  }
}

上記のコードでは、オブジェクトのapplyメソッドを使用して、実行するコードをandでラップしています。また、例の 1 つにエラーを追加すると、"after" コードが常に実行されることがわかります。contextbeforeafter

PS:は、実行中に端末に何かを表示するppようなユーティリティ メソッドです。printlnprintln に対する利点は、引数を返すため、次のように記述できることです。1.pp must_== 1

于 2013-01-13T01:14:30.330 に答える
2

ドキュメントをご覧ください:http://etorreborre.github.com/specs2/guide/org.specs2.guide.Structure.html#Before/After

于 2013-01-12T16:00:08.877 に答える