2010-12-09 8 views
1

Ich bin ein Spock Test zu schreiben, in dem ich ein REST Web-Service haben, die eine XML wie folgt zurückgibt:Finding XML-Element aus RESTClient mit XMLSlurper

<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> 

wollen Mein Test, dass ein bestimmtes userTemplate es zu überprüfen, ist nicht in diesem Dokument. So, HTTP Builder REST-Client und XMLSlurper verwenden, ich tue das folgende:

res = settingsService.get(path: "templates") 
    res.status == 200 
    def delTemplate = res.data.userTemplate.find { 
    println [email protected] == newUserTemplateId 
    [email protected] == newUserTemplateId 
    } 
    delTemplate 

Ich hätte gedacht, dass delTemplate null wäre nach finden Aufruf (weil es keine Vorlage ist mit dieser ID; die Ausdruck println es. @ id == newUserTemplateId druckt immer false, in diesem Fall ist der Wert newUserTemplateId ist 1171).
delTemplate ist vom Typ groovy.util.slurpersupport.NoChildren, und es scheint ein userTemplate-Element zu enthalten.

Lustige Sache ist, wenn ich ein schnelles Skript mit dem gleichen XML als Text schreibe (als Gegenteil davon, es von REST zu lesen), res.userTemplate.find { [email protected] == 1171 } gibt NULL zurück, wie erwartet.

Was mache ich falsch oder wie könnte ich das lösen?

+0

So hat Ihr Dienst zurückkehrt ein XMLSlurper Objekt? – mfloryan

+0

Es tut, soweit ich weiß. RESTClient gibt eine http://groovy.codehaus.org/modules/http-builder/apidocs/groovyx/net/http/HttpResponseDecorator.htm zurück, wobei die Antwortdaten bereits in ein XMLSlurper-Objekt umgewandelt wurden. Ich habe dieses Problem jetzt behoben, indem ich findAll() benutze und dann nach isEmpty() suche, aber ich bin immer noch neugierig, warum es nicht mit find() funktioniert und nach Null sucht. – Alex

Antwort

2

Ich benutze httpBuilder mit XMLSlurper für JUnit Testen von Rest Webservices. Es gibt ein Problem, dass find() auf einem GPathResult immer ein anderes GPathResult zurückgibt - aber das könnte keine Kinder enthalten.

Für Ihre besondere usecase, das Idiom sei ich verwenden würde:

def resp = settingsService.get(path: 'templates') 
assert resp.success 
assert resp.data.userTemplate.find {[email protected] == newUserTemplateId}.isEmpty()