Подтвердить что ты не робот

Не удалось имитировать событие нажатия клавиши Angular 2 unit test (Жасмин)

Я использую директиву для получения данных из ввода, используемых в качестве текста фильтра.

вот мой hostlistener в директиве:

@HostListener('input', ['$event.target.value'])
  public onChangeFilter(event: any): void {
    console.log('input event fired, value: ' + event);
    this.columnFiltering.filterString = event;
    this.filterChanged.emit({filtering: this.columnFiltering});
  }

этот код работает отлично, я не могу unit test тот же.

Я подписался на filterChanged EventEmitter, в моем unit test, чтобы проверить значение.

Я попытался имитировать событие нажатия клавиши, чтобы изменить значение, а также попробовал атрибут значения параметров. Ни один из них не работает для меня.

вот мой файл спецификации:

describe('Table View', () => {
  let fixture: ComponentFixture<any>;
    let context: TableComponent;
   beforeEach(() => {
     TestBed.configureTestingModule({
          providers: [
            TableComponent,
          ],
          imports: [TableModule],
      });
      fixture = TestBed.createComponent(TableComponent);
      context = fixture.componentInstance;
    });
it('should allow filter', () => {
      const element = fixture.nativeElement;
      context.config = config;
      fixture.detectChanges();

      let tableChangeCount = 0;
      let tableEvent: any;
      context.tableChanged.subscribe((event: any) => {
        tableChangeCount++;
        tableEvent = event;
      });
      // Check if table exists
      let inputElement = element.querySelectorAll('tr')[1].querySelector('input');
    let e = new KeyboardEvent("keypress", {
            key: "a",
            bubbles: true,
            cancelable: true,
          });
          inputElement.dispatchEvent(e);
 });

});

Я попробовал установить значение:

let attrs = inputElement.attributes;
      inputElement.setAttribute('value', 'abc');
       for (let i = attrs.length - 1; i >= 0; i--) {
         // Attribute value is set correctly
         if (attrs[i].name === 'value') {
         console.log(attrs[i].name + "->" + attrs[i].value);
         }
       }

Может ли кто-нибудь помочь мне, как я могу unit test то же самое?

4b9b3361

Ответ 1

У меня были проблемы с имитацией нажатия клавиши unit test. Но наткнулся на ответ Сейеда Джалала Хоссейни. Возможно, это то, что вам нужно.

Если вы пытаетесь имитировать нажатие клавиши, вы можете вызвать событие, вызвав dispatchEvent(new Event('keypress')); в элементе.

Вот ответ, на который я ссылаюсь, который дает более подробную информацию: fooobar.com/questions/175877/...

Если вы хотите установить нажатый ключ, это также можно сделать.

const event = new KeyboardEvent("keypress",{
    "key": "Enter"
});
el.dispatchEvent(event);

Дополнительная информация, с которой я только что столкнулся: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

Ответ 2

Если вы хотите использовать key code (или "which" ), вы можете сделать это:

// @HostListener('document:keypress')

const escapeEvent: any = document.createEvent('CustomEvent');
escapeEvent.which = 27;
escapeEvent.initEvent('keypress', true, true);
document.dispatchEvent(escapeEvent);