2016-11-01 9 views
1

Я создаю приложение с угловым выражением, которое использует длительный опрос, чтобы получать быстрые обновления всякий раз, когда что-то меняется на сервере. Я использую $ ресурс, как это извлечь фактические данные:Как тестировать приложения, которые используют длительный опрос с помощью Protractor

appServices.factory('Data', ['$resource', 
    function(){ 
    return $resource('', {}, { 
     query: {"url": …, isArray: false} 
    }); 
}]); 

Тогда у меня есть служба, которая заботится о долгосрочном опросе: Подождите, загружены данные; храните их где-нибудь; через одну секунду начните следующий длинный цикл опроса:

app.factory(„DataLoader“, [„Data“, "$timeout", function(Data, $timeout) { 
    return { 
      loadData: function() { 
       var parent = this; 
       var data = Data.query({}, 
         function(result) { 
          /* do something to the data, 
          * then start waiting for an update from the server again 
          */ 
          $timeout(function() { 
           parent.loadData(); 
          }, 1000); 
         } 
       ); 
      } 
    }; 
}); 

Это работает как шарм.

Тем не менее, я сейчас пытаюсь написать тесты для протранграфа. Проблема в том, что сервер истекает длинные запросы на опрос через 30 секунд, только если никаких изменений в данных нет. Поскольку я жду новых данных в $ timeout, Protractor истекает до того, как будут получены какие-либо результаты.

У меня есть googled последний час, но, похоже, не существует решения, за исключением использования $ interval вместо $ timeout. Это работает в хорошей старой настройке опроса (опрос каждые 3 секунды, получение пустых результатов с сервера, если нет ничего нового). Однако, чтобы этого избежать, я реализовал длительный опрос. $ timeout - это гораздо более разумный вариант для меня.

Можете ли вы дать мне какие-либо советы о том, как успешно использовать Транспортир в этой среде?

+1

Если вы не хотите использовать '$ interval', то _ _ ​​_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 'browser.ignoreSynchronization = true'; Не уверен, есть ли другой вариант – Gunderson

+0

Спасибо за подсказку @Gunderson! Я закончил делать именно это, а затем вручную дождался появления элементов DOM с использованием ожидаемых условий. – fjc

ответ

0

Предлагаю взглянуть на Protractor's documentation on timeouts. Вероятно, вам необходимо увеличить свой allScriptsTimeout в вашем файле конфигурации, так как по умолчанию для синхронизации страниц требуется 11 секунд.

+0

Мысль об этом тоже, только проблема в том, что тогда выполнение теста занимает невероятно много времени. – fjc