2013-01-12 10 views
6

dato il codice come:Specs2 e @ Prima/@ Dopo-come metodi

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 

} 

come faccio a garantire che lo stesso prima e dopo l'esecuzione di codice prima/ dopo "anonimo" e "signinOAuth" e il metodo "dopo" dovrebbe essere eseguito anche se il test non ha esito positivo?

risposta

3

Se stai usando Dato/Quando/Poi passi è possibile utilizzare un Context per controllare ciò che viene eseguito prima e dopo ogni esempio:

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

Nel codice sopra il metodo apply dell'oggetto context viene utilizzato per avvolgere il codice da eseguire con before e after. Inoltre, se aggiungi un errore a uno degli esempi, vedrai che il codice "dopo" viene sempre eseguito.

PS: pp è un metodo di utilità come println per visualizzare qualcosa nel terminale durante l'esecuzione. Il vantaggio su println è che restituisce il suo argomento in modo da poter scrivere 1.pp must_== 1

+0

Grazie! Mi è quasi piaciuto ma non ho trovato il modo di affrontare i contesti. Vorrei aggiornare la guida utente di Specs2 con questo esempio. – jdevelop

+3

Ho aggiornato la documentazione ma ho anche abilitato l'utilizzo dei tratti 'BeforeExample',' AfterExample', ... con i passaggi Given/When/Then (in 1.12.4-SNAPSHOT per Scala 2.9.2 e 1.13.1-SNAPSHOT per Scala 2.10). Vedere la documentazione: http://etorreborre.github.com/specs2/guide-SNAPSHOT/guide/org.specs2.guide.Structure.html#Contexts. – Eric