Я только начал писать тесты e2e для своего приложения, и у меня возникли проблемы с тайм-аутом с Protractor и ngrx / effects.
У меня есть следующий эффект отправки действия каждые пару минут:
@Effect() setSessionTimer$ = this.actions$
.ofType(Auth.ActionTypes.SET_SECONDS_LEFT)
.map(toPayload)
.switchMap(secondsLeft => Observable.concat(
Observable.timer((secondsLeft - 60) * 1000).map(_ => new Auth.SessionExpiringAction(60)),
Observable.timer(60 * 1000).map(_ => new Auth.SessionExpiredAction())
));
Попытка запустить тест Protractor приводит к тайм-ауту теста со следующей ошибкой, поскольку Angular нестабилен.
Ошибка: время ожидания завершения асинхронных задач Angular истекло через 11 секунд. Это может быть связано с тем, что текущая страница не является приложением Angular. Дополнительные сведения см. В разделе часто задаваемых вопросов: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular В ожидании элемента с локатором - Локатор: По (селектор css, .toolbar-title)
Согласно этой проблеме (https://github.com/angular/protractor/issues/3349) Мне нужно использовать NgZone для запуска интервала Observable вне Angular. Я пробовал разные комбинации this.ngZone.runOutsideAngular()
, но ничего не помогло, и тесты продолжаются.
Например, это не работает:
@Effect() setSessionTimer$ = this.actions$
.ofType(Auth.ActionTypes.SET_SECONDS_LEFT)
.map(toPayload)
.switchMap(secondsLeft => this.ngZone.runOutsideAngular(() => Observable.concat(
Observable.timer((secondsLeft - 60) * 1000).map(_ => new Auth.SessionExpiringAction(60)),
Observable.timer(60 * 1000).map(_ => new Auth.SessionExpiredAction())
)));
Я понятия не имею, как запустить эффект вне Angular. Кто-нибудь успешно тестировал свое приложение ngrx с помощью e2e?