如何检查我的元素是否已集中在角度4的单元测试中?

时间:2017-06-22 09:53:13

标签: angular angular2-testing

我有以下功能进行单元测试。我在组件中使用了带有视图子项的文本框元素,在测试中我需要在调用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();
        });
    }));

3 个答案:

答案 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();