2012-07-29 2 views
7

일부 JSON 구문 분석의 유효성을 검사하기 위해 specs 테스트를 만들었습니다. 이 테스트는 완벽하게 잘 작동하지만 다소 시끄 럽습니다.unbox 옵션과 어느 쪽이든 specs matcher가 있습니까

기존 코드가 unbox 옵션에 있습니까?

"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

예, 정합 기의 설명서를 참조하십시오 : http://etorreborre.github.com/specs2/guide/org.specs2.guide.Matchers.html#Matchers –

+0

아, 알았습니다. 나는 아직 사양 1에 있습니다. 내 라이브러리를 업그레이드하는 데 많은 시간을 할애해야합니다. 스펙 1에없는 기능입니까? –

+0

신뢰할 수있는 scala/maven/eclipse/specs - toolchain - up 및 running을 얻는 것은 매우 어렵습니다. 나는 이클립스로 작업 할 스펙을 얻었고 내 의존성의 해당 섹션을 동결시켰다. –

답변

7

을 수

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

덧붙여서,'true must _ == (t.id.get == 228106060337135617l) '를 쓰는 대신 부울 값을 테스트 할 때'(t.id.get == 228106060337135617l) must beTrue'라고 쓸 수 있습니다. – Eric

+0

예, 더 심미적으로 기쁩니다 –

+0

이 matcher는 유형 안전하지 않습니다. '왼쪽 (24)은 왼쪽 (FUBAR)'과 '일부는 (42) 반드시 있어야합니다 ("FUBAR")'모두 컴파일해야합니다. 런타임시에만 오류가 발생합니다. 장기적으로, 여분의 두 단어는 테스트가 실패한 이유를 알아 내려고 낭비 할 때 가치가 있습니다. – drstevens

2

나는 이것을 필요로하지 않았다. Remeber, Option/값 평등을가집니다. 옵션/하나를 포함하는 값과 일치시키는 대신 일치 시키십시오.

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

나는 이것을 컴파일하려고 시도하지 않았지만 제대로 작동해야합니다. 당신은 OptionEither에 대한 몇 가지 특정 매처 (matcher)가 참이 일부 명시 적으로 입력을 추가해야합니다 (또는 안전 입력되지 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

불필요한 부분을 줄이려고 시도 할 때 유효성을 검사 할 34 개의 속성이 있습니다 –

+0

글쎄, 일반적으로 나는 각 속성을 래핑하지 않았을 것입니다. 유효성 검사를하려고합니다. 그것이 당신의 본보기 였기 때문에 나는 그것을했다. 여분의 스펙을 없애기 위해 업데이트되었습니다. – drstevens