我已使用angular2-webpack-starter创建了我的应用,并使用了socket.io。我创建了一个公共服务来创建套接字连接并监听它的方法。用户登录后使用并初始化此服务。当应用程序运行并执行登录测试用例时,我正在使用以下代码检查URL:
browser.getCurrentUrl().then((url) => {
expect(url).toEqual('/dashboard');
});
问题是socket连接时它的抛出错误'等待Protractor在15秒后与页面同步'并且如果socket没有连接相同的测试用例正在运行而没有任何错误。
答案 0 :(得分:0)
所以我找到的解决方案是:
(为方便起见,复制自此处。所有功劳归于https://github.com/cpa-level-it
https://github.com/angular/angular/issues/11853#issuecomment-277185526)
我要解决此问题的方法是,在我有一个依赖socket.io的观察对象中,都使用ngZone。
因此,假设您在服务中使用了此方法,可以在socket.io上进行观察。
private socket: SocketIOClient.Socket;
public getSocketIOEvents(): Observable<SocketIOEvent> {
if (this.socket == null) {
this.socket = io.connect(this._socketPath);
}
return Observable.create((observer: any) => {
this.socket.on('eventA', (item: any) => observer.next(new SocketIOEvent(item)));
this.socket.on('eventB', (item: any) => observer.next(new SocketIOEvent(item)));
return () => this.socket.close();
});
}
然后,您需要使用ngZone服务告诉Angular在Angular 2区域之外创建套接字,然后在Angular 2区域内执行Observable的回调。
import { NgZone } from '@angular/core';
constructor(
private socketService: SocketIOService, ,
private ngZone: NgZone) { }
ngOnInit() {
// Subscribe to the Observable outside Angular zone...
this.ngZone.runOutsideAngular(() => {
this.socketService
.getSocketIOEvents()
.subscribe(event => {
// Come back into Angular zone when there is a callback from the Observable
this.ngZone.run(() => {
this.handleEvent(event);
});
});
});
}
这样,量角器不会挂在插座上。