我一直在使用一些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
}
答案 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),因为它通常是程序员错误。