我正在编写一个Spock测试,其中我有一个REST Web服务,它返回一个这样的XML:
<templates>
<userTemplate id="1109">
<settingsXml/>
<type>USER</type>
<label>template111</label>
<description>template111</description>
</userTemplate>
<userTemplate id="1141" isAutomaticTemplate="true">
<settingsXml/>
<type>USER</type>
<label>An updated user template</label>
</userTemplate>
</templates>
我的测试想要验证特定用户模板在本文档中不是。因此,使用HTTP Builder的REST客户端和XMLSlurper,我正在执行以下操作:
res = settingsService.get(path: "templates")
res.status == 200
def delTemplate = res.data.userTemplate.find {
println it.@id == newUserTemplateId
it.@id == newUserTemplateId
}
delTemplate
我会认为 delTemplate 在调用 find 后会为null(因为没有带有该id的模板; expresion println it。@ id == newUserTemplateId始终打印 false ,在这种情况下, newUserTemplateId 的值为1171)。
但是, delTemplate 的类型为groovy.util.slurpersupport.NoChildren,它似乎包含一个userTemplate元素。
有趣的是,如果我使用与文本相同的XML编写快速脚本(与从REST中读取它相反),res.userTemplate.find { it.@id == 1171 }
将按预期返回null。
我做错了什么,或者我怎么能解决这个问题?
答案 0 :(得分:2)
我使用带有XMLSlurper的httpBuilder进行其余web服务的JUnit测试。有一个问题是,GPathResult上的find()总是返回另一个GPathResult - 但是这可能不包含子项。
对于您的特定用例,我使用的习语是:
def resp = settingsService.get(path: 'templates')
assert resp.success
assert resp.data.userTemplate.find {it.@id == newUserTemplateId}.isEmpty()