Флеш $ тайм-аут в транспортире

Я пишу тест с использованием транспортира, и он всегда ждет, когда закончится время ожидания.

Если я использую ignoreSynchronization = true; он останавливается, чтобы ждать, и тестовые прогоны впереди. Но для моего теста я должен установить обратно ignoreSynchronization = false;, И когда я установил его в false, транспортир останавливается и начинает ждать, пока закончится предыдущий таймаут.

Я использую $ timeout для окна уведомлений и использую это окно для отображения ошибок валидации. В настоящее время я проверяю валидацию, и это делает тест чрезвычайно медленным.

Поэтому решение с ingnoreSynchronization = true не подходит для меня.

Я пытался $timeout.flush(), но это вызывает ошибку $ timeout.flush не является функцией

Я пытался использовать ngMock, но не уверен, что можно использовать его с транспортиром.

Кто-нибудь решает эту проблему?

3 ответа

Решение

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

Транспортир позволяет вам вводить модули из ваших тестов. Так что мы сделали, чтобы переместить наш аргумент длительности тайм-аута в constant, это может быть установлено в 0 при выполнении испытаний транспортира.

В вашем модуле:

.constant('NOTIFICATION_CONSTANTS', {
  TIMEOUT_DURATION: 5000
})

.controller('NotificationController', function($scope, NOTIFICATION_CONSTANTS) 
{
  $scope.showNotification = function() {
    $timeout(function() { hideNotification(); }, NOTIFICATION_CONSTANTS.TIMEOUT_DURATION)
  };
})

в вашем тесте транспортира:

...
beforeAll(function() {
  browser.addMockModule('testConfig', function() {
    angular.module('testConfig', []).run(function(NOTIFICATION_CONSTANTS) {
      NOTIFICATION_CONSTANTS.TIMEOUT_DURATION = 0;
    });
  });
});
...

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

Предполагается, что Protractor ожидает выполнения вызовов $ timeout или $ http до завершения, как часть синхронизации с приложением Angular. Поскольку вы постоянно используете $timeout, у вас есть несколько вариантов:

  1. Измените ваш тайм-аут $, чтобы использовать вместо него интервал Источник: Транспортир Тайм-ауты
  2. Настройте свой файл конфигурации для учета $timeout, взятого из Protractor Master Conf:

По умолчанию Protractor будет отслеживать невыполненные тайм-ауты $ и сообщать о них в сообщении об ошибке, если Protractor не сможет синхронизироваться с Angular во времени. Чтобы сделать это, транспортир должен украсить $ timeout. ВНИМАНИЕ: Если ваше приложение украшает $timeout, вы должны включить этот флаг. Это ложно по умолчанию. untrackOutstandingTimeouts: false,

  1. Задавать browser.ignoreSynchronization = true рассматривать ваше приложение как "неугловое" и использовать ожидаемые условия, чтобы дождаться появления определенных элементов перед выполнением теста. Источник: ожидаемые условия

Похоже, вы не дожидаетесь разрешения обещания установить ignoreSynchronization в true или же false, Я бы попытался вставить функцию в поток управления для установки свойства:

// disable the synchronization
browser.controlFlow().execute(function() {
  browser.ignoreSynchronization = true;
});

// execute some asynchronous code
...

// enable the synchronization
browser.controlFlow().execute(function() {
  browser.ignoreSynchronization = false;
});
Другие вопросы по тегам