Angular 如何在一个角度订阅块内测试代码,而不在后续订阅块中覆盖值?

Angular 如何在一个角度订阅块内测试代码,而不在后续订阅块中覆盖值?,angular,testing,jestjs,ngx-socket-io,Angular,Testing,Jestjs,Ngx Socket Io,我在Angular应用程序中使用ngx socket io,我有一个组件,其中包括ngonit()中的各种.subscribe块,它将在从服务器接收数据时运行 我的问题是,当我在测试套件中调用ngOnInit()时,我无法测试组件变量是否设置为某个特定订阅块中的某个值,因为它将在另一个订阅块中被覆盖 例如: 组成部分: ngOnInit(): void { this.setupBroadcastSubscriptions(); } public setupBroadcast

我在Angular应用程序中使用ngx socket io,我有一个组件,其中包括
ngonit()
中的各种
.subscribe
块,它将在从服务器接收数据时运行

我的问题是,当我在测试套件中调用
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;
      });
}
测试:

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

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

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


最好的方法是什么?

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

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

您说为了简洁起见省略了mock,但它们是其中的关键部分(以及通常的要求)。如果您的模拟方法返回基于主题的观察值,您可以精确地控制它们是否以及何时发出什么值。看看我在中做了些什么,例如,你说为了简洁起见省略了mock,但它们是这项工作的关键部分(以及通常的要求)。如果您的模拟方法返回基于主题的观察值,您可以精确地控制它们是否以及何时发出什么值。例如,看看我在这方面做了些什么
  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');
  });