2016-10-27 2 views
7

Как я могу изнутри во время выполнения angular2 обнаруживать, что я запускаю тестовый режим e2e? У меня есть интервал обновления сеанса, который я не хочу настраивать в режиме тестирования, чтобы избежать проблем синхронизации с транспортиром.Как обнаружить веб-приложение углового2 в тестовом режиме

Очевидным ответом будет поиск параметра URL. Есть ли менее грязное решение?

EDIT (разъяснение перед наградой): Протранслятор подключен к угловому (1 или 2) таким образом, что он будет ждать завершения всей выдающейся работы, прежде чем оценивать что-либо. Это означает, что все выдающиеся угловые promises или любые активные угловые timer будут проверять транспортиры (и в конечном итоге привести к их сбою). Наиболее часто предлагаемым решением является установка browser.ignoreSynchronization = true, но это заставило бы меня либо вложить все тесты e2e в callback-цепочки, либо использовать кучу спальных сон. Возможно, и то, и другое. Таким образом, кажется, что я застрял между камнем и твердым местом, либо имея реальный опыт работы над сценарием e2e тестов, либо устанавливая условие вокруг конкретной строки кода приложения, которое не запускается, когда в «тестовом режиме» (eW, уродливый). Я предпочитаю иметь более простой тест e2e, поскольку я ожидаю записать их в сотни, и пока мы говорим только об одном интервале, который не критичен во время тестирования (30-минутный интервал для обновления сеанса).

+1

Получение окружения от глобальных переменных (например, ENV) довольно распространено. – estus

+0

Я использую 'browser.ignoreSynchronization = true' с Angular2 и не должен ждать, пока модели будут разрешены после изменения. Можете ли вы описать образец, когда 'browser.ignoreSynchronization = true' является проблемой и заставляет вас спать? –

+0

@JuanmiRodriguez Каждый раз что-то асинхронное. Такие, как изменение «страницы» или выборка данных по сети. – Hampus

ответ

1

Вы можете начать свой таймауты/интервалы вне углам главного зоны через

ngZone.runOutsideAngular(() => { 
    // start your timeout/interval here 
}); 

Это позволит избежать транспортировщика, ожидающего окончания интервала времени/интервала , Для получения дополнительной информации см .: https://github.com/angular/protractor/issues/3349

0

один очевидное решение я думаю, является создание глобальной переменной в окне объекта

if(window.TEST_MODE){ 
    // run code that needs to be run during test 
} 

В тестовом коде установлен

window.TEST_MODE = true; 
+1

Хотя это будет работать, это в основном просто более грязное решение, чем то, что предложил @estus с использованием переменных окружения, и это будет решение, над которым я буду работать. Имея конфигурационную переменную, скажем, 'useSessionRefresh = true', и это будет' false', когда будет использоваться конфигурация e2e test config. Кроме того, это не будет загромождать производственный код большим количеством window.TEST_MODE и потенциально может быть ценной конфигурацией. – Hampus

+0

Я согласен, мое решение было просто временным, хотя, если вы спешили – Raaghu

Смежные вопросы