Angular中的单元测试socket.io.

Geo*_*rds 15 unit-testing jasmine socket.io typescript angular

我试图在我的应用程序中单元测试角度服务,这将创建socket.io客户端.我的服务看起来像这样:

export class SocketService {
  private name: string;
  private host: string = window.location.protocol + "//" + window.location.hostname + ":3000";
  socket: io.Socket;

  constructor() { }

  subscribeEvent(name: string): Observable<IJobResp> {
    this.setup(name);
    return new Observable(observer => {
      this.socket.on('job', val => observer.next(val))
    })
  }

  private setup(name: string) {
    this.name = name;
    let socketUrl = this.host + "/" + this.name;
    this.socket = io.connect(socketUrl);
  }
}
Run Code Online (Sandbox Code Playgroud)

所以要编写我的测试,我使用mock-socket库来设置一个mock socket.io服务器.这是测试的样子:

describe('SocketService', () => {
  let socket;

  const mockServer = new Server('http://localhost:3000/');
  mockServer.on('connection', server => {
    mockServer.emit('job', 'test message 1');
  });

  (window as any).io = SocketIO;
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [JobService]
    });
  });

  it('should xyz, inject([JobService], fakeAsync((service: JobService) => {
    service.subscribeEvent('/').subscribe(val => {
      expect(val).toEqual('test message 1');
    })
  })));
});
Run Code Online (Sandbox Code Playgroud)

但是,该测试会引发错误:

错误:无法在假异步测试中制作XHR.

如果我没有fakeAsync,那么测试在处理中的断言之前通过subscribe().

我该如何解决这个问题?

更新:

我尝试过的另一种方法是使用asynceg

  it('should subscribe to dwnTime events', async(inject([JobService], (service: JobService) => {
    service.subscribeEvent('line/602').subscribe(val => {
      expect(val).toEqual('test 2');
    })
  })));
Run Code Online (Sandbox Code Playgroud)

然后我得到:

错误:超时 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时内未调用异步回调.

这看起来像是一个时间问题,但我仍然不确定为什么?

小智 2

您的第二种方法是正确的,因为模拟服务器是真实的,因此您需要通过设置来增加超时

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;(该值有待调整)

描述函数内的任何位置。

在这里您可以找到完整的示例。