2013-11-02 19 views
14

Sto testando Goniometro con una piccola app AngularJS.

Questa è la prova:

describe('Testing Protractor', function() { 
    var draftList; 

    it('should count the number of drafts', function() { 
    browser.get('#/'); 
    draftList = element.all(by.repeater('newsletter in drafts')); 
    expect(draftList.count()).toEqual(2); 
    }); 
}); 

Controller:

angular.module('myApp.controllers', []). 
    controller('DraftsCtrl', ['$scope', 'Draft', function($scope, Draft) { 
    $scope.drafts = Draft.query(); 
}]) 

Progetto di servizio:

angular.module('myApp.services', ['ngResource']). 
    factory('Draft', ['$resource', 
    function($resource) { 
     return $resource('api/drafts/:id') 
    }]) 

esecuzione di questo test con risultati Goniometro il seguente errore:

Error: Timed out waiting for Protractor to synchronize with the page after 11 seconds 

Tuttavia, se nel controller cambio questa linea:

$scope.drafts = Draft.query(); 

a questo:

$scope.drafts = []; 

Il test ha esito negativo come previsto, ma ancora più importante: non timeout.

Con query() abilitato, sia quando si esegue l'app manualmente in un browser e quando si guarda la finestra del browser aperta da Goniometro, i dati restituiti dall'API vengono visualizzati correttamente da un ripetitore.

Perché il goniometro non è in grado di sincronizzarsi con la pagina quando il servizio sta comunicando con l'API?

AngularJS è v1.2.0-rc3. Il goniometro è v0.12.0.

risposta

26

Questo è un known issue, ma esiste una soluzione temporanea. Impostare ptor.ignoreSynchronization = true.

Ad esempio:

describe('Testing Protractor', function() { 
    var draftList; 
    var ptor; 

    beforeEach(function() { 
    ptor = protractor.getInstance(); 
    ptor.ignoreSynchronization = true; 
    }); 

    it('should count the number of drafts', function() { 
    ptor.get('#/'); 
    draftList = element.all(by.repeater('newsletter in drafts')); 
    expect(draftList.count()).toEqual(2); 
    }); 
}); 
+1

Grazie, proverò questo fuori più tardi e ti faccio sapere se ha funzionato. In realtà ho letto il problema di GitHub prima di postare qui, ma avevo l'impressione che la soluzione alternativa fosse necessaria solo quando si esegue il polling di un'API a intervalli regolari che la mia app di test non sta eseguendo. Invia solo la richiesta API una volta, quando il controller è inizializzato. –

+10

Questa era davvero la soluzione corretta. Poiché Protractor 0.12.0 espone l'istanza di Goniometro come 'browser', è bastato aggiungere semplicemente' browser.ignoreSynchronization = true; 'prima di' element.all (by.repeater ('...')); '. –

+0

Funziona perfettamente! – softvar

3

browser.ignoreSynchronization = true; ha funzionato per me.

1

sto usando goniometro 3.3.0 e per farlo funzionare nel mio test ho dovuto rimandare la sincronizzazione ignorare fino a dopo che avevo fatto la messa a punto.

Così nel mio beforeeach io chiamo la mia azione:

var searchBox = element(by.css('#inpt_search')); 
searchBox.sendKeys('test'); 

Ho poi devono aspettare per il backend finto per popolare la vista (io non sono contento di questi sleep chiamate quindi se qualcuno ha un modo migliore di fare questo si prega di commentare, non posso ottenere expectedConditions.presenceOf a lavorare come fa parte dello stesso bug) utilizzando browser.sleep(500). Quindi nel test ho impostato browser.ignoreSynchronization = true che sblocca tutto ciò che è bloccato e vede il contenuto del browser.

describe('standard search', function(){ 
    beforeEach(function(){ 
     openApp(); 
     var searchBox = element(by.css('#inpt_search')); 
     searchBox.sendKeys('test'); 
     browser.sleep(500); 
    }); 
    it('should work or summat', function() { 
     browser.ignoreSynchronization = true; 
     var fileItems = element.all(by.repeater('item in list')); 
     expect(fileItems.count()).toEqual(50); 
    }); 
}); 
+0

grazie Stevo, funziona per me su Protractor 4.0.10 –

0

Invece di utilizzare browser.ignoreSynchronization, utilizzare browser.waitForAngularEnabled(*boolean*). browser.waitForAngularEnabled(false) set browser.ignoreSynchronization a true, browser.waitForAngularEnabled(true) set browser.ignoreSynchronization a false.

è anche possibile includere questo come parte del file di configurazione il test suite:

onPrepare: function() { 
    'use strict'; 
    browser.waitForAngularEnabled(false); 
}