我在组件中有一个表单字段(用户名),当更新时调用服务来检查数据库中值的可用性。一切正常,但我似乎无法触发该字段的更新功能。
以下是组件代码的摘录:
ngAfterViewInit() {
this.username.update
.debounceTime(500) // wait 1/2 second before emitting last event
.distinctUntilChanged() // only emit value if different from last value
.subscribe((username: string) => {
console.log('IN SUBSCRIBE'); // <==== This is not being reached in the tests
let data = { type: 'username', val: username };
this._loginSrvc.chkUser(data).subscribe((response: IChkUserResponse)=>{
if(response.isAvailable === false)
this.username.control.setErrors({'taken': {value: this.username.value}});
});
});
}
这是组件模板中的字段:
<mat-form-field fxFlex>
<input matInput placeholder="Username" aria-label="Username" forbiddenCharacters=';"\\\/\[\]\{\}\(\)' required [(ngModel)]="model.username" #username="ngModel" id="username" name="username">
<mat-error *ngIf="newUserFrm.hasError('required','username')">Username is required</mat-error>
<mat-error *ngIf="newUserFrm.hasError('forbiddenCharacters','username')">{{forbiddenChars.error}}</mat-error>
<mat-error *ngIf="newUserFrm.hasError('taken','username')">The username <em>{{model.username}}</em> is taken</mat-error>
</mat-form-field>
这是我的测试:
it('should check for username availability',fakeAsync(()=>{
spyOn(service,'chkUser');
let input = fixture.debugElement.query(By.css('#username')).nativeElement;
expect(input.value).toBe('');
expect(component.username.value).toBe(null);
input.value = user.username;
input.dispatchEvent(new Event('input'));
tick(500);
expect(service.chkUser).toHaveBeenCalled();
}));
最后expect(service.chkUser).toHaveBeenCalled()
是导致我的测试失败的原因。我已经在应用程序中运行了这个组件,它按预期工作我只是想让测试通过。我已经尝试了很多设置输入值和调度事件的组合,等待夹具检测更改或使用 whenStable(),抛出一个承诺,使用 fakeAsync 而不是使用 fakeAsync。似乎没有任何效果。