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');
}));