我正在用Angular编写测试。
我要测试的组件具有以下代码:
ngOnInit() {
this.cognitoService.isAuthenticated().then(() => this.loadForm(),
() => this.router.navigate(['/home/login']));
}
loadForm() {
this.createFormControls();
this.createForm();
this.userProperties = new Map();
this.cognitoService.getUserAttributes(['name', 'custom:lastName', 'email', 'picture', 'phone_number',
'custom:id', 'custom:description']).subscribe(attributes => this.completeProfileForm(attributes));
}
cognitoService.isAuthenticated()方法返回一个Promise。 cognitoService.getUserAttributes 方法返回一个Observable。
测试是这样的:
it('should create', () => {
spyOn(cognitoService, 'getUserAttributes').and.callFake(function () {
const userProperties = new Map();
userProperties.set('custom:lastName', 'lastName');
userProperties.set('name', 'firstName');
userProperties.set('email', 'example@email.com');
userProperties.set('picture', 'picture.png');
userProperties.set('phone_number', '+5412123434');
userProperties.set('custom:id', '1');
userProperties.set('custom:description', 'description');
return Observable.of(userProperties);
});
spyOn(cognitoService, 'isAuthenticated').and.returnValue(Promise.resolve());
component.ngOnInit();
fixture.detectChanges();
expect(component).toBeTruthy();
fixture.whenStable().then(() => {
expect(component).toBeTruthy();
});
});
这样,当我运行测试时,终端显示:空测试套件 但是,如果我以这种方式更改代码:
ngOnInit() {
this.cognitoService.isAuthenticated().then(null,
() => this.router.navigate(['/home/login']));
this.loadForm();
}
测试运行正常。但是我不喜欢以前的代码,因为我只想在Promise解决后才调用loadForm()方法。
你知道发生了什么吗?