Angular 如何在一个角度订阅块内测试代码,而不在后续订阅块中覆盖值?
我在Angular应用程序中使用ngx socket io,我有一个组件,其中包括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
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');
});