我想对以下方法进行单元测试:
this.boxValue = '';
subscribeToFilterChanges(): void {
this.filterBox.valueChanges
.subscribe(
data => {
if (data) {
this.boxValue = data.trim().toLowerCase();
}
}
);
}
filterBox是一个FormControl:
filterBox = new FormControl('');
HTML是:
<mat-form-field appearance="standard">
<input matInput [formControl]="filterBox"
id="filterBox-input">
</mat-form-field>
我将单元测试写为:
it('verify filter changes', () => {
let filterBoxInput = fixture.debugElement.query(By.css('#filterBox-input'));
filterBoxInput.nativeElement.value = 'dummy';
filterBoxInput.nativeElement.dispatchEvent(new Event('input'));
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(component.boxValue).toBe('dummy1');
});
});
该测试应该会失败,但是即使.toBe()中指定了错误的值,它仍然显示为通过状态
可能是什么问题?
我参考了Angular Testing: FormControl valueChanges Observable,并如上所述在我的代码中使用了它,但这并没有解决问题。
答案 0 :(得分:0)
我认为这里的问题是,您在操作input
时未正确初始化组件。
您必须在创建组件之后立即通过调用fixture.detectChanges();
来告诉Angular执行数据分析:
const fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
此外,如评论中所述,此处不需要whenStable
。
完成的测试如下:
it('verify filter changes', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const component = fixture.debugElement.componentInstance;
let filterBoxInput = fixture.debugElement.query(By.css('#filterBox-input'));
filterBoxInput.nativeElement.value = 'dummy';
filterBoxInput.nativeElement.dispatchEvent(new Event('input'));
fixture.detectChanges();
expect(component.boxValue).toBe('dummy'); // should pass
});