2016-09-04 1 views
2

Ich verwende Grails Plugin Multi-Tenant-Single-Db. In diesem Zusammenhang muss ich einen Spock-Test schreiben, in dem wir die Mieterbeschränkungen vorübergehend entfernen. Die Lage ist mein Mieter, so meine Methode sieht wie folgt aus:Spock Test, wenn die zu testende Methode den Abschluss enthält

def loadOjectDetails(){ 
     Location.withoutTenantRestriction{ 
      // code here to retrieve specific items to the object to be loaded 
      render(template: "_loadDetails", model:[ ... ] 
     } 
} 

Das Verfahren läuft wie erwartet, aber versuchen, Verfahren unter Testabdeckung setzen der Fehlerausgang legt nahe, dass:

groovy.lang.MissingMethodException: No signature of method: com.myPackage.myController.Location.withoutTenantRestriction() is applicable for argument types: 

und ein stacktrace, dass kommt von dort auf.

Muss ich dies stubben? Die WithoutTenantRestriction ist ein Wrapper um meine gesamte Methodenlogik.

UPDATE: Der Test-Code sieht wie folgt aus:

given: 
    params.id = 3002 
    currentUser = Mock(User) 
    criteriaSetup() 
    controller.getSalesOrder >> salesOrders[2] 

    when: 
    controller.loadOrderManageDetails() 

    then: 
    (1.._) controller.springSecurityService.getCurrentUser() >> currentUser 


    expect: 
    view == 'orderMange/orderManageDetail' 
    model.orderInstance == salesOrders[2] 
+0

Wie sieht der Testcode aus? – railsdog

+0

Ich aktualisierte die Frage mit meinem Testcode wie angefordert – TroyB

Antwort

0

Ja! Sie sollten es stubbing, wie zur Laufzeit nicht zur Kompilierzeit erstellt wird. Man könnte es wie unten Stummel:

Your_Domain.metaClass.withoutTenantRestriction{Closure closure -> 
      closure.call() 
} 

Auf diese Weise Ihre regelmäßige Code wird in Testfällen arbeiten. Wie in withoutTenantRestriction startet es im Grunde eine neue Ruhezustand-Sitzung, die nicht viel ausmacht, da Sie nun die Schließung beendet haben, können Sie die gewünschte Aktion anstelle von nur closure.call() aufrufen.

Auch könnte dasselbe auf withThisTenant angewendet werden.

Bei Integrationstests müssen Sie keine Stubs ausführen, da die gesamte Umgebung geladen wird.

Hoffe es hilft !!

+0

Nur eine Frage zum Ersetzen von 'closure.call()' mit dem Code, der ausgeführt würde. Würde der Test dann fehlschlagen, wenn oder wenn die ursprüngliche Methode geändert wird? – TroyB

+0

Nun, wenn Sie Code dort eingeben, wird dieser Code ausgeführt, aber keine ursprüngliche Methode Code, wie es an Schließung übergeben wurde. –

Verwandte Themen