1

我正在编写一个 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>

我的测试想验证一个特定的 userTemplate 它不在这个文档中。因此,使用 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

我会认为调用find后delTemplate会为空(因为没有具有该 id 的模板;表达式 println it.@id == newUserTemplateId 总是打印false,在这种情况下newUserTemplateId的值为 1171)。 但是,delTemplate的类型是 groovy.util.slurpersupport.NoChildren,它似乎包含一个 userTemplate 元素。

有趣的是,如果我使用与文本相同的 XML 编写一个快速脚本(反对从 REST 读取它),则按res.userTemplate.find { it.@id == 1171 }预期返回 null。

我做错了什么,或者我该如何解决这个问题?

4

1 回答 1

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()
于 2011-08-01T13:37:22.437 回答