2015-06-13 8 views
10

Es gibt ähnliche Fragen (unten verlinkt), aber keine löst dieses Problem. Ich schreibe Winkeluntersuchungen für ein ionisches Projekt. Ich muss Tests durchführen, wenn ein ionischer Ladedialog erscheint und verschwindet.Warten auf ionische Ladedialoge mit Winkelmesser

Ich habe ein Repo mit den Grundlagen der App und den Tests erstellt, die gemacht werden müssen. Lösen Sie dies und Sie lösen das Problem (ich beschreibe das Problem unten): https://github.com/TmanTman/StackoverflowQ. Passen Sie den Pfad zu Ihrem Chrome für Ihr System in conf.js an.

einen asynchronen Ionic Laden Dialog zu simulieren ich dies nur in einem leeren Ionic Projekt in die Steuerung hinzu:

$interval(function() { 
     $ionicLoading.show({ 
      template: 'Async ionicLoading', 
      duration: 5000 
     }); 
     }, 5000 , 1); 
    }) 

Ich brauche Winkelmesser zu bekommen, um den Dialog zu warten einige Tests zu erscheinen, zu tun, warten der Dialog verschwindet und führt dann weitere Tests durch. Mein letzter Versuch in meiner Testdatei ist:

it('should only test when ionicLoading appears', function() { 
    browser.wait(function(){ 
    return element(by.css('.loading-container.visible.active')).isPresent(); 
    }, 10000); 
    var ionicLoadingText = element(by.css('.loading-container.visible.active')).getText(); 
    expect(ionicLoadingText).toEqual('Async IonicLoading'); 
}) 



it('should only test once ionicLoading disappears', function() { 
    browser.wait(function() { 
    var deferred = protractor.promise.defer(); 
    var q = element(by.css('.loading-container.visible.active')).isPresent() 
     q.then(function (isPresent) { 
     deferred.fulfill(!isPresent); 
     }); 
     return deferred.promise; 
    }); 
    expect(1).toEqual(1); 
}) 

Ich versuche, synchrone Schlaffunktion zu vermeiden, da mein Code hoch asynchron ist. Ich habe unzählige Variationen ausprobiert, aber ich kann es nicht zur Arbeit bringen. Links I für Informationen verwendet haben, enthält:

+1

Welche Fehler haben Sie? Wird die Erwartung im ersten Block ausgeführt, bevor der Dialog erscheint oder gibt es einen Zeitüberschreitungsfehler? – Dziamid

+1

Timeout-Fehler im ersten Block: "Fehlgeschlagen: Wartezeit abgelaufen nach 10472 ms". –

Antwort

6

Das Problem ist zweifach:

1) Von dem, was ich ableiten kann, die Die Dauereigenschaft der $ ionicLoading-Methode wird mit einer Timeout-Funktion implementiert. Winkelmesser funktioniert nicht gut mit $ Timeout. Anstatt also die Dauer Eigenschaft verwendet, kann der $ ionicLoading Dialog mit einem $ Intervallaufruf ausgeblendet werden (der Code von der Frage der Anpassung):

$interval(function() { 
     $ionicLoading.show({ 
      template: 'Async IonicLoading' 
     }); 
     $interval(function() { 
     $ionicLoading.hide(); 
     }, 5000, 1) 
    }, 5000 , 1); 

2) Der Code der asynchrone Änderung zu erkennen ist die folgende:

it('should only test when ionicLoading appears', function() { 
    browser.wait(function() { 
     var deferred = protractor.promise.defer(); 
     var q = element(by.css('.loading-container.visible.active')).isPresent() 
     q.then(function (isPresent) { 
      deferred.fulfill(isPresent); 
     }); 
     return deferred.promise; 
    }, 10000); 
     var ionicLoadingText = element(by.css('.loading-container.visible.active')).getText(); 
     expect(ionicLoadingText).toEqual('Async IonicLoading'); 
    }) 

    it('should only test once ionicLoading disappears', function() { 
     browser.wait(function() { 
     var deferred = protractor.promise.defer(); 
     var q = element(by.css('.loading-container.visible.active')).isPresent() 
      q.then(function (isPresent) { 
      deferred.fulfill(!isPresent); 
      }); 
      return deferred.promise; 
     }, 10000); 
     expect(1).toEqual(1); 
    }) 

Dann beide Tests bestanden.

+1

Schöner Fang! ionicLoading.duration [verwendet $ timeout] (https://github.com/driftyco/ionic/blob/ce06f6e40bdb2bc560d9241aa1ef23db4fff065f/js/angular/service/loading.js#L64). Ausgezeichnetes Beispiel für eine undichte Abstraktion bei Verwendung mit Protractor. – avandeursen

+1

Ich habe auf dem Ionic-Forum gefragt, ob ich die ionicLoading.duration -Eigenschaft mit einem $ interval anstelle von $ timeout versuchen sollte http://forum.ionicframework.com/t/loading-implement-the-duration-with- Intervall-statt-Timeout/26839 –

+0

Sie sollten :-) Los geht's! – avandeursen