Angular 如何在数据库中使用订阅对嵌套服务方法进行单元测试

Angular 如何在数据库中使用订阅对嵌套服务方法进行单元测试,angular,typescript,Angular,Typescript,我有一个类似这样的服务类,并尝试添加我无法理解的单元测试用例,如何使用订阅测试嵌套方法 TestService { constructor(@Inject(ENV) private env, private userService: UserService, private addressService: AddressService) {} public getDetails(): void { this.getUser

我有一个类似这样的服务类,并尝试添加我无法理解的单元测试用例,如何使用订阅测试嵌套方法

TestService {
  constructor(@Inject(ENV) private env,
              private userService: UserService,
              private addressService: AddressService) {}

  public getDetails(): void {
    this.getUser().subscribe((user) => {
      if (user && user !== null) {
        this.addressService.getAddress(user).subscribe((address) => {
          this.addressService.updateAddress(user).subscribe(() => {
          
          });
        });
      }
    });
  }

  private getUser(): Observable<string> {
    return userService.findUser().pipe(map((response: any) => response.output.user), take(1));
  }
}
错误:

应为“测试”
调用次数:0

我相信您会发现,由于过于复杂,测试代码很困难。最好不要嵌套订阅

让我们尝试将代码分成小块,以便于测试

private getUser():可观察{
返回userService.findUser().pipe(
map(({output})=>output.user),
以(一)为例,;
}
public getDetails():可观察{
返回此.getUser()管道(
合并映射(用户=>user?forkJoin([
此.addressService.getAddress(用户),
this.addressService.updateAddress(用户)]:of(null)),
映射(([地址]=>地址)
)
}
现在我们可以简单地订阅测试中的可观察项

it('get user不应在user为null时调用),异步(()=>{
spyOn(userService,'getUser')。和.returnValue(of(null));
service.getDetails().subscribe({
下一步:res=>{
expect(res.toBeNull();
}
});
}));

我相信您会发现,由于过于复杂,测试代码很困难。最好不要嵌套订阅

让我们尝试将代码分成小块,以便于测试

private getUser():可观察{
返回userService.findUser().pipe(
map(({output})=>output.user),
以(一)为例,;
}
public getDetails():可观察{
返回此.getUser()管道(
合并映射(用户=>user?forkJoin([
此.addressService.getAddress(用户),
this.addressService.updateAddress(用户)]:of(null)),
映射(([地址]=>地址)
)
}
现在我们可以简单地订阅测试中的可观察项

it('get user不应在user为null时调用),异步(()=>{
spyOn(userService,'getUser')。和.returnValue(of(null));
service.getDetails().subscribe({
下一步:res=>{
expect(res.toBeNull();
}
});
}));
it('get user should not call if user is null', async(() => {
  service.getDetails();
  spyOn(userService, 'getUser').and.returnValue(of('TEST'));
  const addressServiceSpy = spyOn(addressService, 'getAddress');
  expect(addressServiceSpy).toHaveBeenCalledWith('TEST');
}));