2013-11-02 3 views
14

Я тестирую Транспортир с небольшим приложением AngularJS.

Это испытание:

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

Контроллер:

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

Проект служба:

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

Выполнение этого теста с использованием результатов транспортира в следующей ошибке:

Однако, если в контроллере я изменить эту строку:

$scope.drafts = Draft.query(); 

к этому:

$scope.drafts = []; 

Тест терпит неудачу, как и ожидалось, но что более важно: это не тайм-аут.

С включенным запросом(), как при запуске приложения вручную в браузере, так и при просмотре окна браузера, открытого в Protractor, данные, возвращаемые API, корректно отображаются ретранслятором.

Почему Protractor не может синхронизироваться со страницей, когда служба взаимодействует с API?

AngularJS - v1.2.0-rc3. Транспортир v0.12.0.

ответ

26

Это known issue, но есть временное обходное решение. Набор ptor.ignoreSynchronization = true.

Например:

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

Спасибо, я постараюсь это позже, и пусть вы знаете, работал ли он. На самом деле я действительно прочитал эту проблему GitHub перед публикацией здесь, но у меня создалось впечатление, что обходной путь необходим только при регулярном опросе API, который мое тестовое приложение не делает. Он отправляет запрос API только один раз, когда контроллер инициализируется. –

+10

Это действительно правильное решение. Поскольку Protractor 0.12.0 предоставляет экземпляр Protractor как «браузер», достаточно было просто добавить 'browser.ignoreSynchronization = true;' перед 'element.all (by.repeater ('...'));'. –

+0

Прекрасно работает! – softvar

3

browser.ignoreSynchronization = true; работал для меня.

1

Я использую Protractor 3.3.0 и чтобы это работало в моем тесте, мне пришлось отложить синхронизацию игнорирования до тех пор, пока я не выполнил настройку.

Так что в моем beforeEach Звонят действие:

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

Я тогда придется ждать макета бэкэнда заселить мнение (я не доволен этим sleep звонков, так что если у кого есть лучший способ делать это, пожалуйста, прокомментируйте, я не могу получить expectedConditions.presenceOf, чтобы работать, поскольку это часть той же ошибки), используя browser.sleep(500). Затем в тесте я установил browser.ignoreSynchronization = true, который блокирует все заблокированные и видит содержимое браузера.

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

спасибо Stevo, он работает для меня на Protractor 4.0.10 –

0

Вместо использования browser.ignoreSynchronization используйте browser.waitForAngularEnabled(*boolean*). browser.waitForAngularEnabled(false)browser.ignoreSynchronization до true, browser.waitForAngularEnabled(true) комплекты browser.ignoreSynchronization до false.

вы можете также включить это как часть файла конфигурации ваших тестовых наборов:

onPrepare: function() { 
    'use strict'; 
    browser.waitForAngularEnabled(false); 
} 
Смежные вопросы