8

JSON 解析を検証するために、仕様テストを作成しました。テストは完璧に機能しますが、かなりうるさく感じます。

OptionとEitherをアンボックスする仕様に既存のコードがあるのだろうか?

"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]
}
4

2 に答える 2

7

実際、 and には特定のマッチャーがいくつかありOptionますEither

t.id must beSome(228106060337135617l)
t.id_str must beSome("228106060337135617")
t.created_at.left.map(_.getHours) must beLeft(13)
于 2012-07-29T23:25:41.113 に答える
2

私はこれが必要だとは思いませんでした。Option/Either には値が等しいことを思い出してください。それらに含まれる値を一致させるのではなく、オプション/いずれかを一致させるだけです。

      "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)
于 2012-07-29T23:09:04.277 に答える