Angular2 e2e测试案例与量角器投掷错误

时间:2016-08-13 07:19:00

标签: sockets angular protractor e2e-testing

我已使用angular2-webpack-starter创建了我的应用,并使用了socket.io。我创建了一个公共服务来创建套接字连接并监听它的方法。用户登录后使用并初始化此服务。当应用程序运行并执行登录测试用例时,我正在使用以下代码检查URL:

browser.getCurrentUrl().then((url) => {
    expect(url).toEqual('/dashboard');    
});

问题是socket连接时它的抛出错误'等待Protractor在15秒后与页面同步'并且如果socket没有连接相同的测试用例正在运行而没有任何错误。

1 个答案:

答案 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);
          });
        });
    });

  }

这样,量角器不会挂在插座上。