2012-07-29 27 views
7

Tôi đã tạo một kiểm tra thông số kỹ thuật, để xác thực một số phân tích cú pháp JSON. Mặc dù thử nghiệm hoạt động tốt, nhưng nó cảm thấy khá ồn ào.Có một trình so khớp thông số nào sẽ bỏ chọn tùy chọn và một trong số

Tôi tự hỏi nếu có mã hiện có trong Thông số kỹ thuật cho tùy chọn bỏ hộp và chọn?

"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

Vâng, hãy xem hướng dẫn quẹt: http://etorreborre.github.com/specs2/guide/org.specs2.guide.Matchers.html#Matchers –

+0

Ah, ok. Tôi quên nói, tôi vẫn còn trên Specs 1. Chỉ có rất nhiều thời gian để chi tiêu vào việc nâng cấp các thư viện của tôi. Tính năng này có nằm trong Thông số 1 không? –

+0

Rất khó để có được một scala/maven/eclipse/specs đáng tin cậy - toolchain - up và đang chạy. Tôi có thông số kỹ thuật để làm việc với Eclipse và đóng băng phần phụ thuộc của tôi. –

Trả lời

7

Có thực sự một số quẹt cụ thể cho OptionEither:

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

Nhân tiện, thay vì viết 'true phải _ == (t.id.get == 228106060337135617l)' bạn có thể viết '(t.id.get == 228106060337135617l) phải làTrue' khi bạn muốn kiểm tra giá trị Boolean. – Eric

+0

Vâng, điều đó mang tính thẩm mỹ cao hơn –

+0

Những đối sánh này không an toàn. 'Trái (24) phải làLeft (" FUBAR ")' và 'Một số (42) phải là một số (" FUBAR ")' cả hai biên dịch. Chúng chỉ thất bại khi chạy. Về lâu dài, thêm vài từ sẽ có giá trị trong thời gian bạn lãng phí cố gắng tìm ra lý do tại sao thử nghiệm của bạn không thành công. – drstevens

2

Tôi không tìm thấy điều này cần thiết. Remeber, Option/Hoặc có giá trị bình đẳng. Chỉ cần khớp với Tùy chọn/Hoặc thay vì khớp với các giá trị mà chúng chứa.

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

Tôi không cố gắng biên dịch chúng, nhưng chúng sẽ hoạt động. Bạn có thể cần thêm một số cách gõ rõ ràng (hoặc sử dụng must_== mà không phải là loại an toàn)

 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

Cố gắng cắt giảm sự lộn xộn, có 34 thuộc tính để xác thực –

+0

Vâng, thông thường tôi sẽ không bao gồm từng thuộc tính mà tôi đã cố gắng xác thực. Tôi chỉ làm điều đó vì nó nằm trong ví dụ của bạn. Tôi cập nhật để loại bỏ các thông số kỹ thuật phụ lộn xộn. – drstevens

Các vấn đề liên quan