2016-05-17 9 views
0

Ich versuche, eine Groovy-Klasse zu testen, die einen injizierten RestClient hat.Spock Argument entspricht MarkupBuilder closures

class MyService { 
    def restClient 

    def put() { 
     restClient.put(
       path: "foo", 
       contentType: "XML", 
       body: { foo { bar(baz) }} 
     ) 
    } 
} 

Dies funktioniert OK in manuellen Tests.

Ich will es mit Spock testen:

@TestFor(MyService) 
class MyServiceSpec extends Specification { 

    RESTClient restClient = Mock() 

    def setup() { 
     service.restClient = restClient 
    } 

    def "posts to restClient"() { 
     when: 
     service.put() 

     then: 
     1 * service.restClient.put([ 
       path: "foo", 
       contentType: "XML", 
       body: { foo { bar(baz) }} 
     ]) 
    } 
} 

Dies schlägt fehl: Spock nicht die Argumente prüfen zu lassen. Wie kann ich Spock erkennen lassen, dass es sich um dieselben Argumente handelt?

(Grails 2.3.11)

Update: Ich denke, der Kern des Problems ist, dass { foo() } == { foo() } falsch ist. How to assert equality of two closures

Ich sehe, dass ich die Schließungen in Spock erfassen konnte, XML aus den Schließungen erstellen und die XML-Objekte vergleichen. Was ist eine prägnante und lesbare Möglichkeit, dies zu erreichen?

Antwort

0

können Sie die Verwendung _ (undescore Operator) in Spock "irgendetwas" passen

then: 
     1 * service.restClient.put(_) 

Sollte wahrscheinlich ok

arbeiten