2015-06-13 13 views
10

Ci sono domande simili (collegate sotto) ma nessuna risolve questo problema. Sto scrivendo i test dei goniometri per un progetto Ionic. Ho bisogno di eseguire test nei momenti in cui appare una finestra di dialogo di caricamento ionico che scompare.In attesa di finestre di dialogo di caricamento ionico con il rapportatore

Ho creato un repository con le ossa nude dell'app e i test che devono essere eseguiti. Risolvilo e risolvi il problema (descrivo il problema sotto): https://github.com/TmanTman/StackoverflowQ. Basta adattare il percorso al tuo Chrome per il tuo sistema in conf.js.

Per simulare un dialogo Caricamento ionico asincrono Ho appena aggiungi a al controller in un progetto ionico vuoto:

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

ho bisogno di ottenere goniometro per attendere che venga visualizzata la finestra di dialogo, fare qualche test, attendere la finestra di dialogo scomparirà, quindi eseguirà altri test. Il mio ultimo tentativo nel mio file di test è:

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); 
}) 

sto cercando di evitare di utilizzare la funzione sleep sincrona, come il mio codice è altamente asincrono. Ho provato innumerevoli variazioni ma non riesco a farlo funzionare. Link che ho usato per info comprende:

+1

Quali errori hai? L'aspettativa nel primo blocco viene eseguita prima della visualizzazione della finestra di dialogo o c'è un errore di timeout? – Dziamid

+1

Errore di timeout sul primo blocco: "Non riuscito: attesa scaduta dopo 10472 ms". –

risposta

6

Il problema è duplice:

1) Da quello che posso dedurre, il La proprietà duration del metodo $ ionicLoading è implementata con una funzione di timeout. Il goniometro non funziona bene con il timeout $. Così, invece di utilizzare la proprietà durata, la finestra di $ ionicLoading può essere nascosto con una chiamata $ dell'intervallo (adattando il codice dalla questione):

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

2) Il codice per rilevare la modifica asincrona è la seguente:

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); 
    }) 

Quindi entrambi i test passano.

+1

Bella cattura! ionicLoading.duration [utilizza $ timeout] (https://github.com/driftyco/ionic/blob/ce06f6e40bdb2bc560d9241aa1ef23db4fff065f/js/angular/service/loading.js#L64) in effetti. Esempio eccellente di astrazione che perde quando utilizzato con Goniometro. – avandeursen

+1

Ho chiesto al forum Ionic se dovrei provare a implementare la proprietà ionicLoading.duration con un intervallo di $ anziché $ timeout http://forum.ionicframework.com/t/loading-implement-the-duration-with- intervallo-invece-di-timeout/26839 –

+0

Si dovrebbe :-) Vai per questo! – avandeursen

Problemi correlati