Ожидание диалогов Ionic Loading с транспортиром

Есть похожие вопросы (связанные ниже), но ни один из них не решает эту проблему. Я пишу тесты Protractor для Ionic Project. Мне нужно выполнять тесты время от времени, когда появляется и исчезает диалоговое окно Ionic Loading.

Я создал репозиторий с голыми костями приложения и тестами, которые необходимо выполнить. Решите это, и вы решите проблему (я описываю проблему ниже): https://github.com/TmanTman/StackoverflowQ . Просто адаптируйте путь к вашему Chrome для вашей системы в conf.js.

Чтобы смоделировать диалоговое окно асинхронной загрузки Ionic, я просто добавляю это в контроллер в пустой проект Ionic:

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

Мне нужно заставить транспортир дождаться появления диалогового окна, выполнить несколько тестов, дождаться исчезновения диалогового окна, а затем выполнить еще несколько тестов. Моя последняя попытка в моем тестовом файле:

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

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


person Tielman Nieuwoudt    schedule 13.06.2015    source источник
comment
Какие ошибки у вас есть? Выполняется ли ожидание в первом блоке до появления диалогового окна или есть ошибка тайм-аута?   -  person Dziamid    schedule 14.06.2015
comment
Ошибка тайм-аута в первом блоке: Ошибка: время ожидания истекло через 10472 мс.   -  person Tielman Nieuwoudt    schedule 14.06.2015


Ответы (1)


Проблема двоякая:

1) Из того, что я могу сделать, свойство продолжительности метода $ionicLoading реализовано с функцией тайм-аута. Транспортир плохо работает с $timeout. Таким образом, вместо использования свойства продолжительности диалоговое окно $ionicLoading можно скрыть с помощью вызова $interval (адаптируя код из вопроса):

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

2) Код для обнаружения асинхронного изменения следующий:

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

Тогда оба теста проходят.

person Tielman Nieuwoudt    schedule 20.06.2015
comment
Хорошо поймал! ionicLoading.duration использует $timeout конечно. Отличный пример дырявой абстракции при использовании с Protractor. - person avandeursen; 20.06.2015
comment
Я спросил на форуме Ionic, следует ли мне попытаться реализовать свойство ionicLoading.duration с интервалом $, а не с $timeout forum.ionicframework.com/t/ - person Tielman Nieuwoudt; 22.06.2015
comment
Вы должны :-) Дерзайте! - person avandeursen; 22.06.2015