Флеш $ тайм-аут в транспортире
Я пишу тест с использованием транспортира, и он всегда ждет, когда закончится время ожидания.
Если я использую 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, у вас есть несколько вариантов:
- Измените ваш тайм-аут $, чтобы использовать вместо него интервал Источник: Транспортир Тайм-ауты
- Настройте свой файл конфигурации для учета $timeout, взятого из Protractor Master Conf:
По умолчанию Protractor будет отслеживать невыполненные тайм-ауты $ и сообщать о них в сообщении об ошибке, если Protractor не сможет синхронизироваться с Angular во времени. Чтобы сделать это, транспортир должен украсить $ timeout. ВНИМАНИЕ: Если ваше приложение украшает $timeout, вы должны включить этот флаг. Это ложно по умолчанию.
untrackOutstandingTimeouts: false
,
- Задавать
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;
});