2013-03-19 113 views
0

我正在写一个单元测试,验证xml是否格式正确,但这是失败的,我不明白为什么。Groovy漂亮打印XML断言失败

所以我决定测试代码this blog post并在Grails控制台中测试,它也失败了。

import groovy.xml.* 

def prettyXml = '''\ 
<?xml version="1.0" encoding="UTF-8"?> 
<languages> 
    <language id="1">Groovy</language> 
    <language id="2">Java</language> 
    <language id="3">Scala</language> 
</languages> 
''' 


// Pretty print a non-formatted XML String. 
def xmlString = '<languages><language id="1">Groovy</language><language id="2">Java</language><language id="3">Scala</language></languages>' 
assert XmlUtil.serialize(xmlString) == prettyXml 

断言失败:

Assertion failed: 

assert XmlUtil.serialize(xmlString) == prettyXml 
       |   |   | | 
       |   |   | <?xml version="1.0" encoding="UTF-8"?> 
       |   |   | <languages> 
       |   |   | <language id="1">Groovy</language> 
       |   |   | <language id="2">Java</language> 
       |   |   | <language id="3">Scala</language> 
       |   |   | </languages> 
       |   |   false 
       |   <languages><language id="1">Groovy</language><language id="2">Java</language><language id="3">Scala</language></languages> 
       <?xml version="1.0" encoding="UTF-8"?> 
       <languages> 
       <language id="1">Groovy</language> 
       <language id="2">Java</language> 
       <language id="3">Scala</language> 
       </languages> 

我使用Grails 2.2.1,使用Groovy的2.0.7,在Windows 7

也许是与操作系统相关的线东西分隔器?

编辑

我救了两个字符串的文件,用记事本++

分析的XML(XmlUtils)有CL+RF作为行分隔符,但prettyXml只有LF检查。我还测试了使用\n而不是多行声明,结果相同!

Groovy不应该总是使用CL+RF,因为这是Windows行分隔符?

+0

如何在十六进制编辑器中打开两个版本以检查奇怪的EOL字节和内容? – Will 2013-03-19 20:08:57

+2

[也许试试xmlunit](http://stackoverflow.com/questions/13727876/comparing-two-xml-strings-files-in-groovy-java)? – 2013-03-19 20:20:11

+0

@WillP好的。有时候你花了很多时间看到你的大脑停止工作了。检查我的更新 – 2013-03-19 20:22:32

回答

0

Groovy String/GString docs,它说相对于多行的文字:

有[原文如此]总是由字符“\ n”表示,而不管 主机的行终止约定系统。

不幸的是,他们并不真正说出原因。