2017-08-09 3 views
0

ich ein Grails 2.5.6 Projekt mit einem Rest-Controller haben, in denen ich schaffen n async Aufgaben jeder von ihnen eine Methode in einem Dienst wie dieser Aufruf:Grails Asynchron-Integrationstests

// MyController 
... 
def statuses = ['where', 'ownership', 'store'] 
def tasks = statuses.collect { st -> 
    task { 
     return myService.invokeMethod(st, [aDomain, data]) 
    } 
} 
def props = waitAll(tasks) 
... 


// MyService 
... 
store(aDomain, data) { 
    ... 
    def store = Store.get(data.store) 
    ... 
} 

Wenn ich ausführen die Anwendung, der Store ist korrekt in der Datenbank gefunden.

Ich habe auch einen Integrationstest erstellt. Um Konflikte zu vermeiden mit vorhandenen Daten in der Datenbank erstelle ich eine neues Store während des Tests:

// Integration test (simplified) 
.... 
def store = new Store(....) 
store.save(flush: true) 
... 
def json = [store: store.id] as JSON 
... 
controller.request.content = params.toString() 
controller.request.method = "POST" 
controller.update() 
... 

Wenn ich die Tests ausführen, erstellt der neue Speicher ist nicht im Dienst gefunden und der Test fehlschlägt. Ich habe die Situation in einigen Punkten der Anwendung überprüft und festgestellt, dass: - wenn ich den Laden in der Steuerung (vor oder nach der Ausführung der Aufgaben) suchen, ist es gefunden - wenn ich alle Geschäfte in der Liste Service-Methode der neue Shop existiert nicht.

Ich nehme an, dass dieses Verhalten darauf zurückzuführen ist, wie Hibernate-Sitzung während Tests behandelt wird, aber ich weiß nicht, wie es gelöst wird. Jeder Vorschlag ist willkommen.

Danke

Antwort

0

Versuchen Sie, Synchronouse Promise Factory für Tests zu verwenden.

void setup() { 
    Promises.promiseFactory = new SynchronousPromiseFactory() 
} 
+0

Danke, es funktioniert – GUL

Verwandte Themen