我刚刚开始为我的应用程序编写 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())
));
尝试运行量角器测试会导致测试超时并出现以下错误,因为 Angular 不稳定。
失败:等待异步 Angular 任务在 11 秒后完成超时。这可能是因为当前页面不是 Angular 应用程序。有关更多详细信息,请参阅常见问题解答: https ://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular 在等待带有定位器的元素时 - 定位器:By(css 选择器,.工具栏标题)
根据这个问题(https://github.com/angular/protractor/issues/3349),我需要使用 NgZone 在 Angular 之外运行一个区间 Observable。我尝试了不同的组合,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 之外运行效果。有没有人成功地 e2e 测试了他们的 ngrx 应用程序?