Orchestrierung der Annullierung im lang laufenden Komponententest

8

Ich schreibe Komponententests für die "Leim" -Schicht meiner Anwendung und habe Schwierigkeiten, deterministische Tests für asynchrone Methoden zu erstellen, mit denen der Benutzer die Operation vorzeitig abbrechen kann.

Genauer gesagt gibt es in einigen asynchronen Methoden Code, der auf die Aufhebung des Aufrufs reagiert und sicherstellt, dass sich das Objekt vor dem Abschluss in dem richtigen Zustand befindet. Ich möchte sicherstellen, dass diese Code-Pfade durch Tests abgedeckt werden.

Ein C # -Pseudocode, der eine typische asynchrone Methode in diesem Szenario veranschaulicht, ist wie folgt:

%Vor%

Die Lösung, die ich bisher gefunden habe, besteht darin, die zugrundeliegenden MyDependency -Operationen, die von der Leimschicht umschlossen sind, zu verspotten und sie für eine beliebige Zeit in den Ruhezustand zu zwingen. Ich rufe dann die Async-Methode auf und sage meinem Unit-Test für einige Millisekunden, bevor er die Async-Anfrage abbricht, in den Ruhezustand.

So etwas (mit Rhino Mocks als Beispiel):

%Vor%

Abgesehen davon, dass die Verwendung von Thread.Sleep in einem Komponententest mich nervös macht, ist das größere Problem, dass Tests wie diese auf unserem Build-Server fehlschlagen, wenn sie unter erheblicher Last stehen. Der Async-Anruf wird zu weit und der Abbruch kommt zu spät.

Kann jemand eine zuverlässigere Methode zum Testen der Abbruchlogik für lange laufende Operationen wie diese bereitstellen? Irgendwelche Ideen würden geschätzt werden.

    
Andrew Anderson 08.06.2010, 13:23
quelle

2 Antworten

6

Ich würde versuchen, Mocks zu verwenden, um asynchrones Verhalten synchron zu "simulieren". Anstatt

zu verwenden %Vor%

und dann setze ich das Abbruch-Flag innerhalb einer beliebigen Anzahl von Millisekunden, würde ich es nur als Teil des Callbacks setzen:

%Vor%

Aus der Sicht Ihres Codes sieht dies so aus, als ob die Stornierung während des Anrufs stattgefunden hat.

    
Grzenio 08.06.2010, 13:54
quelle
1

Jede der lang laufenden Operationen sollte ein Ereignis auslösen, wenn sie gestartet werden.

Haken Sie dieses Ereignis im Komponententest ab. Dies ergibt deterministische Ergebnisse mit dem Potenzial, dass die Ereignisse in der Zukunft nützlich sein könnten.

    
Kevin Driedger 08.06.2010 13:54
quelle