2013-01-12 82 views
6

鑑於類似的代碼: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 

} 

我怎麼保證之前,執行代碼之後同前/ 後「匿名」 「signinOAuth」 ,即使測試本身失敗,「after」方法應該執行 ?

回答

3

如果您正在使用鑑於/時/然後步驟,你可以使用一個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 
    } 
} 

在上面的代碼中,使用context對象的apply方法將代碼包裝爲使用beforeafter執行。另外,如果您向其中一個示例添加錯誤,您將看到「after」代碼始終執行。

PS:pp是一種實用方法,如println在執行期間在終端中顯示某些內容。優於println的是它返回它的參數,所以你可以寫1.pp must_== 1

+0

謝謝!我幾乎這樣做,但沒有找到如何處理上下文。我希望用這個例子更新Specs2用戶指南。 – jdevelop

+3

我已經更新了文檔,但也啓用了使用'BeforeExample','AfterExample',...特徵與給定/當/然後步驟(1.12.4-SNAPSHOT for Scala 2.9.2和1.13.1-SNAPSHOT對於Scala 2.10)。請參閱文檔:http://etorreborre.github.com/specs2/guide-SNAPSHOT/guide/org.specs2.guide.Structure.html#Contexts。 – Eric