2012-02-01 3 views
13

Sto provando a scrivere un test Specs2 che testerà l'output di un frammento in risposta a diversi parametri che normalmente verrebbero passati da un modello , ma non sono stato in grado di capire come farlo.Scala/Lift: come scrivere test di unità che testano la risposta di un frammento a diversi parametri

Ad esempio, con la didascalia frammento in questo div:

<div class="lift:Snippet.method?param1=foo"></div> 

sto passando il parametro param1 al snippet. Il mio frammento sarebbe simile a questa:

class Snippet { 
    def method(in:NodeSeq):NodeSeq = { 
    val param1 = S.attr("param1") openOr "" 
    param1 match { 
     case "foo" => //do something 
     case "bar" => //do something else 
     case _ => //do yet another thing 
    } 
    } 
} 

Quindi entro la mia prova, voglio verificare come il frammento di risponde alle diverse param1 valori

class SnippetTest extends Specification { 
    "Snippet" should { 
    "do something" in { 
     val html = <ul> 
      <li class="first"> 
      <li class="second"> 
      <li class="third"> 
     </ul> 

     //I need to set param1 here somehow 
     val out = Snippet.method(html) 
     //then check that it did what it was supposed to 
     out.something must be "xyz" 
    } 
    } 
} 

Come faccio a impostare param1?

Sono un grande tempo scala e lift newb (proveniente da python + django), quindi se sto abbaiando dall'albero sbagliato, per favore indirizzami a quello giusto. Penso che potrebbe essere il caso, sono stato googling su questo tutto il giorno e non ho trovato alcuna domanda lontanamente simile a questo.

Grazie,

Blake

risposta

11

Ok, ho ottenuto questo capito. Questa domanda non ha visto molto interesse, ma nel caso qualcuno sia là fuori a cercare lo stesso problema/problema, ecco come lo fai:

L'oggetto "S" dell'ascensore deve avere aggiunto i nostri attributi arbitrari così che darà al nostro snippet gli attributi che vogliamo testare quando richiesto. Sfortunatamente, ci sono 2 problemi. Innanzitutto, l'oggetto "S" viene inizializzato solo quando viene ricevuta una richiesta http. Secondo, S.attr è immutabile.

Lift dispone di un pacchetto chiamato mockweb che consente di effettuare simulazioni di richieste http. La documentazione di questo pacchetto parla generalmente di sessioni di test e accessi utente e quant'altro, ma fornisce anche meccanismi per l'inizializzazione di "S" come parte di un test di specifica.

Il primo problema, inizializzando S, viene risolto definendo la nostra classe di test come un'estensione di WebSpec anziché di Specification (WebSpec fa parte del pacchetto mockweb e estende la specifica) e chiama "withSFor" durante la definizione della specifica, che inizializzerà "S"

Il secondo problema, considerando che S.attr è immutabile, è risolto con il metodo "S" "withAttrs". "withAttrs" esegue un blocco di codice che fornisci sia con gli attributi normali che con gli attributi forniti da te in una mappa. I suoi attributi arbitrari sono disponibili solo da S.attr temporaneamente

Ecco il test da mia domanda iniziale che è stato modificato per risolvere i problemi: 2

import net.liftweb.mockweb._ 

class SnippetTest extends WebSpec { 
    "Snippet" should { 
    "do something" withSFor("/") in { 
     val html = <ul> 
      <li class="first"> 
      <li class="second"> 
      <li class="third"> 
     </ul> 

     //here I set param1 
     var m = new HashMap[String, String] 
     m += "param1" -> "foo" 

     val s = new Snippet() 

     //then tell S to execute this block of code 
     //with my arbitrary attributes. 
     //'out' will be the NodeSeq returned by s.method 
     val out = S.withAttrs(S.mapToAttrs(m)){ 
     s.method(html) 
     } 

     //then check that it did what it was supposed to 
     out.something must be "xyz" 
    } 
    } 
} 

edit: chiarezza

+0

Nota che sembra come in Lift 2.4, la caratteristica WebSpec che usi richiede la deprecata [Specifiche] (https://code.google.com/p/specs/) in contrasto con [Specs2] (http://etorreborre.github.com/ specs2 /). Ho trovato un tratto WebSpec2 in un gist (https://gist.github.com/2235088), attraverso [pagina "Frammenti di test delle unità con un utente registrato" nella wiki di Assembla Lift] (http: // www. assembla.com/wiki/show/liftweb/Unit_Testing_Snippets_With_A_Logged_In_User). –

+1

Non so se questo aiuta meno di un po ': https://www.assembla.com/wiki/show/liftweb/Testing_Lift_Applications – tyoc213