2012-07-29 14 views
7

Ho creato un test delle specifiche per convalidare l'analisi JSON. Sebbene il test funzioni perfettamente, sembra piuttosto rumoroso.C'è un verificatore di specifiche che cancellerà l'opzione e O

Mi chiedo se esiste un codice esistente in Specifiche per annullare l'opzione e l'opzione?

"twitter json to Scala class mapper" should { 
    "parsing a tweet" in { 
     TwitterJsonMapper.tweetP(tweetS) match { 
     case Right(t: Tweet) => { 
      implicit def unOption[T](t: Option[T]): T = t.get 
      implicit def unEither[T](t: Either[T,Throwable]): T = t match {case Left(left) => left ;case Right(t) => throw t} 
      "test id" in { 
      true must_== (t.id.get == 228106060337135617l) 
      } 
      "test id_str" in { 
      true must_== (t.id_str.get == "228106060337135617") 
      } 
      "test time" in { 
      true must_== (t.created_at.getHours == 13) 
      } 
     } 
     case Left((pe: JsonParseException, reason: String)) => fail(reason + "\n" + pe) 
     } 
    } 
    } 

//The Tweet is produced from JSON using Fasterxml's Jackson-Scala library. 
//I want to use Option or Either monads over all child attributes - for the usual reasons. 
case class Tweet(
    @BeanProperty contributors: Option[String], 
    @BeanProperty coordinates: Option[String], 

    @BeanProperty @JsonDeserialize (
     using = classOf[TwitterDateDeserializer] 
) created_at: Either[Date,Throwable], 
    @BeanProperty favorited: Boolean = false, 
    //elided etc etc 
    @BeanProperty id_str: Option[String] 
} 
+1

Sì, vedere la guida matchers: http://etorreborre.github.com/specs2/guide/org.specs2.guide.Matchers.html#Matchers –

+0

Ah, ok. Ho dimenticato di dire che sono ancora sulle specifiche 1. Ho solo tanto tempo da dedicare all'aggiornamento delle mie librerie. La funzione non è nelle specifiche 1? –

+0

È davvero difficile ottenere una scala affidabile/maven/eclipse/specifiche - toolchain - attiva e funzionante. Ho avuto le specifiche per lavorare con Eclipse e ho congelato quella sezione delle mie dipendenze. –

risposta

7

Ci sono infatti alcuni matchers specifici per Option e Either:

t.id must beSome(228106060337135617l) 
t.id_str must beSome("228106060337135617") 
t.created_at.left.map(_.getHours) must beLeft(13) 
+0

A proposito, invece di scrivere 'true deve _ == (t.id.get == 228106060337135617l)' puoi scrivere '(t.id.get == 228106060337135617l) deve essereTrue' quando vuoi testare un valore booleano. – Eric

+0

Sì, è più esteticamente gradevole –

+0

Questi fiammiferi non sono sicuri. 'Left (24) deve essere Left (" FUBAR ")' e 'Alcuni (42) devono essere Some (" FUBAR ")' entrambi compilati. Falliscono solo in fase di esecuzione. A lungo termine, le ulteriori due parole valgono il tempo che hai sprecato cercando di capire perché il tuo test sta fallendo. – drstevens

2

Non ho trovato necessario. Ricorda, Opzione/Entrambi hanno uguaglianza di valore. Basta abbinare l'opzione/E anziché il confronto con i valori che contengono.

Non ho provato a compilare questi, ma dovrebbero funzionare. Potrebbe essere necessario aggiungere un po 'di battitura esplicita (o utilizzare must_== che non è di tipo sicuro)

 t.id must be equalTo Some(228106060337135617l) 
     t.id_str must be equalTo Some("228106060337135617") 
     t.created_at.left.map(_.getHours) must be equalTo Left(13) 
+0

Cercando di ridurre il disordine, ho 34 attributi per convalidare –

+0

Beh, normalmente non avrei spostato ogni attributo che ero cercando di convalidare. L'ho fatto solo perché era nel tuo esempio. Ho aggiornato per rimuovere l'ingombro di specifiche aggiuntive. – drstevens