我有以下功能进行单元测试。我在组件中使用了带有视图子项的文本框元素,在测试中我需要在调用setTimeout()
后测试我的文本框是否有焦点。
@ViewChild('searchInput') searchInput: ElementRef;
function A(show) {
const self = this;
if (show) {
this.xyz= true;
setTimeout(function () {
self.searchInput.nativeElement.focus();
}, 0);
} else {
self.xyz= false;
self.abc = '';
}
}
以下是我正在尝试的测试用例:
it('textbox get focus toggleSearch', async(() => {
let el: DebugElement;
component.toggleSearch(true);
el = fixture.debugElement.query(By.css('#search-input-theme'));
let native: HTMLElement = el.nativeElement;
spyOn(native,'focus');
fixture.whenStable().then(() => {
expect(native.focus).toHaveBeenCalled();
});
}));
答案 0 :(得分:4)
可能是这样的:
const input = de.query(By.css("your_field_selector")).nativeElement;
const focusElement = de.query(By.css(":focus")).nativeElement;
expect(focusElement).toBe(nomeInput);
路易斯
答案 1 :(得分:3)
Luis Abreu的回答对我有用,因为我不仅想要调用焦点方法,而且焦点设置在视图上的右侧元素上。这是一个例子:
describe('Email input focus', () => {
beforeEach(() => {
spyOn(comp.emailField.nativeElement, 'focus');
comp.ngAfterViewInit();
});
it('Should call the focus event', () => {
expect(comp.emailField.nativeElement.focus).toHaveBeenCalled();
});
it('Should be focused on the view', () => {
fixture.detectChanges();
const emailInput = de.query(By.css('#email')).nativeElement;
const focusedElement = de.query(By.css(':focus')).nativeElement;
expect(focusedElement).toBe(emailInput);
});
});
答案 2 :(得分:0)
您可以直接查询本机元素并使用唯一的选择器
const input = fixture.nativeElement.querySelector('#your-input-id:focus');
expect(input).toBeTruthy();