我正在尝试对按钮是否专注于单元测试,但似乎无法让间谍正常工作?
我看到了[这篇文章] [1],但并没有完全解决问题。
我缺少明显的东西吗?
component.ts
ngOnInit() {
// autofocus on the cancel button to guard against mistakes
document.getElementById('cancel').focus();
}
答案 0 :(得分:2)
重点一开始就是有缺陷的。
使用Angular时,不应使用document
来获取元素。
改为使用viewChild。
@ViewChild('cancel') cancelButton: ElementRef<HtmlButtonElement>;
ngAfterViewInit() {
this.cancelButton.nativeElement.focus();
}
现在您的测试看起来像这样
it('should focus cancel button', () => {
spyOn(component.cancelButton.nativeElement, 'focus');
component.ngAfterViewInit();
expect(component.cancelButton.nativeElement.focus).toHaveBeenCalledWith();
});
编辑如果您仍然想使用自己的方式,请考虑使用By.css()
:
it('should autofocus on cancel button on init', () => {
const cancelButton = fixture.debugElement.query(By.css('#cancel'));
spyOn(cancelButton, 'focus');
component.ngOnInit();
expect(cancelButton.focus).toHaveBeenCalled();
});
答案 1 :(得分:1)
在您的规格中创建ngOnInit()
后,请回忆起spy
,正如@trichietrichie指出的那样
另外,利用fixture
而不是依靠document
来获取html元素。
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [ ConfirmationComponent ],
providers: [ MessageService]
});
fixture = TestBed.createComponent(ConfirmationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
component.ngOnInit();
});
it('should autofocus on cancel button on init', () => {
const cancelButton = fixture.debugElement.query(By.css('#cancel'));
spyOn(cancelButton.nativeElement, 'focus'); // create spy here
component.ngOnInit();
expect(cancelButton.focus).toHaveBeenCalled();
});