scalatest using包含带有ArrayBuffers的allElementsOf

时间:2017-12-07 06:57:22

标签: xml scala contains scalatest

我一直在使用一些XML数据,并且一直在尝试编写一个测试,试图匹配两个xml树的直接子节点具有bar类型的所有相同节点。

我开始使用简单的测试来确保两个数据结构匹配。

将它们作为字符串匹配的断言起作用:

result.toString should be(expected.toString)

但匹配每个元素的断言失败:

result should contain allElementsOf expected
我在 answer here

上找到了

因为这些更简单的断言不起作用:

result should be(expected)
result should contain(expected(1))

测试使用测试类中的before块设置XML:

  var foo: Elem = _

  before {
   foo = <foo>
     <bar type="greet" style="pleasent" target="anyone">hi</bar>
     <bar type="count">1</bar>
     <bar type="color">yellow</bar>
     <baz>
      <bar type="bad">Bad</bar>
    </baz>
  </foo>
}

这是测试代码:

it should "allow use of map and filter" in {
  import scala.collection.mutable.ArrayBuffer

  val expected = ArrayBuffer(
    (
      "bar",
      Map(
        "type" -> "greet",
        "style" -> "pleasent",
        "target" -> "anyone"
      ),
      "hi"
    ),
    (
      "bar",
      Map("type" -> "count"),
      "1"
    ),
    (
      "bar",
      Map("type" -> "color"),
      "yellow"
    )
  )

  val result = foo.child.map(x => {
    x match {
      case <bar>{text}</bar> => (x.label, x.attributes.asAttrMap, text)
      case <baz>_</baz> => (x.label, Map[String,String](), "")
      case _ => ("", Map[String,String](), "")
    }
  })
  .filter(x => {
    x match {
      case ("bar", _, _) => true
      case _ => false
    }
  })


  result.toString should be(expected.toString) // works
 // result should contain allElementsOf expected // fails

}

1 个答案:

答案 0 :(得分:2)

您要比较的集合中的元素类型不同:

  • result包含(String, Map[String, String], Object)
  • 类型的元素
  • expected包含(String, Map[String, String], String)
  • 类型的元素

他们可能具有相同的toString表示,但这并不意味着他们是平等的。 result的类型可能与您对此模式匹配的预期不同:

x match {
  case <bar>{text}</bar> => (x.label, x.attributes.asAttrMap, text)
  case <baz>_</baz> => (x.label, Map[String,String](), "")
  case _ => ("", Map[String,String](), "")
}

此处text的类型为xml.Node。如果要提取节点的内容,可以使用text.text,这也会使测试通过。

除此之外:最近有一个PR与Scala合并,在推断出Object类型时发出警告(scala/scala#6178),因为它通常是程序员错误。