3

メソッドcase classを持つのテスト ケースを書きたいと思います。toXML

import java.net.URI

case class Person(
  label: String = "author",
  name: String,
  email: Option[String] = None,
  uri: Option[URI] = None) {

  // author must be either "author" or "contributor"
  assert(label == "author" ||
    label == "contributor")

  def toXML = {
    val res =
      <author>
        <name>{ name }</name>
        {
          email match {
            case Some(email) => <email>{ email }</email>
            case None => Null
          }
        }
        {
          uri match {
            case Some(uri) => <uri>{ uri }</uri>
            case None => Null
          }
        }
      </author>

    label match {
      case "author" => res
      case _ => res.copy(label = label) // rename element
    }
  }
}

ここで、出力が正しいことを主張したいと思います。したがって、私は使用しますscala.xml.Utility.trim

import scala.xml.Utility.trim

val p1 = Person("author", "John Doe", Some("jd@example.com"),
  Some(new URI("http://example.com/john")))
val p2 =
  <author>
    <name>John Doe</name>
    <email>jd@example.com</name>
    <uri>http://example.com/john</uri>
  </author>

assert(trim(p1.toXML) == trim(p2))

しかし、これはアサーション エラーを引き起こします。文字列表現を比較して同等性を主張しようとすると

assert(trim(p1.toXML).toString == trim(p2).toString)

アサーションエラーはありません。

私は何を間違っていますか?

4

1 に答える 1

2

まず第一に、あなたのコードには何か問題があります:コンストラクターの引数としてuri: Option[URI](これは であると仮定していますjava.net.URI) を持っていますが、コンストラクターを . で呼び出しますOption[String]

これはあなたの問題の原因でもあります:

scala> val uri = "http://stackoverflow.com/q/10676812/334519"
uri: java.lang.String = http://stackoverflow.com/q/10676812/334519

scala> <u>{new java.net.URI(uri)}</u> == <u>{uri}</u>
res0: Boolean = false

scala> <u>{new java.net.URI(uri)}</u>.toString == <u>{uri}</u>.toString
res1: Boolean = true

何が起こっているかというと、要素の子は、それが運ぶ値Atomの型パラメーターを持つです。dataあなたのp1this はURI(コンストラクターと一致するようにテストを修正したと仮定して) であり、p2それはString.

于 2012-05-20T20:43:51.390 に答える