1

我在 Angular 应用程序中使用 ngx-socket-io,并且我有一个组件,其中包含.subscribe内的各种块ngOnInit(),随后将在从服务器接收到数据时运行

我的问题是,当我ngOnInit()在测试套件中调用时,我无法测试组件变量是否设置为某个特定订阅块内的内容,因为它将在另一个订阅块内被覆盖。

例如:

零件:

  ngOnInit(): void {
    this.setupBroadcastSubscriptions();
  }

  public setupBroadcastSubscriptions() {
    this.joinGameService.isHost()
      .subscribe((data: any) => {
         this.hostName = data.hostName;
      });
    this.gameService.onUserDisconnection()
      .subscribe((data: any) => {
        this.toastr.info(data.message);
        this.playersInLobby = data.players;
        this.hostName = data.players.find(player => player.isHost).username;
      });
}

测试:

  test('when the first user enters a lobby, it should set the hostName to the user emitted from the server', () => {
    component.ngOnInit();
    expect(component.hostName).toEqual('james');
  });

(为简洁起见,省略了测试套件中的模拟)

我想测试订阅hostName内部具体发生了什么。isHost但是,hostName会在onUserDisconnection订阅内被覆盖。

一种解决方案是在订阅块内创建一个方法并单独测试该方法,但我不想测试私有方法。

最好的方法是什么?

4

1 回答 1

0

如果你使用 waitForAsync,你可以使用 tick() 来增加计时器,这样你就可以测试第一个订阅,然后再次打勾并测试第二个订阅。

于 2021-01-03T18:04:02.667 回答