2012-07-29 23 views
7

मैंने कुछ JSON पार्सिंग को सत्यापित करने के लिए एक चश्मा परीक्षण बनाया है। यद्यपि परीक्षण अच्छी तरह से काम करता है, लेकिन यह शोर महसूस करता है।क्या कोई चश्मा मैचर है जो विकल्प को अनबॉक्स करेगा और

मुझे आश्चर्य है कि अनबॉक्स विकल्प के लिए विनिर्देशों में मौजूदा कोड मौजूद है या नहीं?

"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

हाँ, matchers मार्गदर्शिका देखें: http://etorreborre.github.com/specs2/guide/org.specs2.guide.Matchers.html#Matchers –

+0

आह, ठीक है। मैं कहना भूल गया, मैं अभी भी चश्मा पर हूं 1. केवल मेरे पुस्तकालयों को अपग्रेड करने के लिए खर्च करने के लिए इतना समय मिला है। क्या सुविधा स्पेक्स 1 में नहीं है? –

+0

विश्वसनीय स्कैला/मेवेन/एक्लिप्स/चश्मा - टूलचेन - अप और रनिंग प्राप्त करना बहुत मुश्किल है। मुझे एक्लिप्स के साथ काम करने के लिए चश्मे मिल गए और मेरी निर्भरताओं के उस खंड को ठंडा कर दिया। –

उत्तर

7

कुछ स्पष्ट टाइपिंग जोड़ना पड़ सकता है वहाँ वास्तव में Option और Either के लिए कुछ विशिष्ट matchers हैं:

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

वैसे, 'सत्य जरूरी _ == (t.id.get == 228106060337135617l) लिखने के बजाय' आप लिख सकते हैं '(t.id.get == 228106060337135617l) होना चाहिए जब आप एक बूलियन मान का परीक्षण करना चाहते हैं। – Eric

+0

हां, यह अधिक सौंदर्यपूर्ण रूप से सुखद है –

+0

ये matchers सुरक्षित प्रकार नहीं हैं। 'बाएं (24) होना चाहिए ("FUBAR") 'और ' कुछ (42) कुछ होना चाहिए (" FUBAR ") 'दोनों संकलित करें। वे केवल रनटाइम पर असफल हो जाते हैं। लंबे समय तक, शब्दों का अतिरिक्त जोड़ा उस समय के लायक होगा जब आप यह पता लगाने की कोशिश कर रहे थे कि आपका परीक्षण विफल क्यों हो रहा है। – drstevens

2

मुझे यह आवश्यक नहीं मिला है। Remeber, विकल्प/या तो मूल्य समानता है। अपने मूल्यों से मेल खाने के बजाय विकल्प/या तो बस मिलान करें।

 "Option should match other options" >> { 
     Some(21) must be equalTo Some(21) 
     } 

     "Either should match Either" >> { 
     Right("Some string") must be equalTo Right("Some string") 
     } 

मैंने इन्हें संकलित करने की कोशिश नहीं की, लेकिन उन्हें काम करना चाहिए। आप (या must_== जो सुरक्षित टाइप नहीं किया गया है)

 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

अव्यवस्था पर कटौती करने का प्रयास करने के लिए, –

+0

मान्य करने के लिए 34 विशेषताएँ हैं, ठीक है, सामान्यतः मैं प्रत्येक विशेषता को लपेट नहीं पाया होता था मान्य करने की कोशिश कर रहा है। मैंने केवल यही किया क्योंकि यह आपके उदाहरण में था। मैं अतिरिक्त चश्मा अव्यवस्था को हटाने के लिए अद्यतन किया। – drstevens